2016-08-05 1 views
1

LinuxからOS/Xに移植するのは難しいです。私はインライン関数を別の関数本体の中に埋め込んでいます。 Linuxでは、gccはコードをうまくコンパイルしましたが、OS/Xではclangがエラーを報告します。ここでclangの問題:Cの別の関数本体の中のインライン関数

は、コードスニペットであるLinuxの

$ cat inline.c 
void func() { 
     inline int max(int a, int b) { return (a>b) ? a : b; } 
     int c = max(11,22); 
} 

、すべてが

Linux $ gcc -c inline.c 
Linux $$ gcc --version 
gcc (Ubuntu 5.2.1-22ubuntu2) 5.2.1 20151010 

しかし、OS/X上の打ち鳴らすには文句を言い、

OSX $ cc -c inline.c 
inline.c:2:38: error: function definition is not allowed here 
     inline int max(int a, int b) { return (a>b) ? a : b; } 
            ^
inline.c:3:17: warning: implicit declaration of function 'max' is invalid in C99 
     [-Wimplicit-function-declaration] 
     int c = max(11,22); 
       ^
1 warning and 1 error generated. 
OSX $ cc --version 
Apple LLVM version 7.3.0 (clang-703.0.31) 
Target: x86_64-apple-darwin15.5.0 

は、このAは、大丈夫ですgcc "feature"またはこの機能を有効にするclangフラグがありますか?

+0

実際のコードでその関数の 'max'を何回呼び出しますか? – user3386109

+0

はい、GCCの機能です。 [ネストされた関数](https://gcc.gnu.org/onlinedocs/gcc/Nested-Functions.html#Nested-Functions)は標準ではありません。C. Clangはオブジェクトを処理する権限を持っています。あなたのコードをポータブルにするには、しないでください。 –

+0

ここで「インライン」とは全く意味がありません。関数定義をいくつかの.cファイルに表示されるようなヘッダーファイルに配置する場合は、貴重なツールです。同じ.cファイルの中にあるものは、予告なしにコンパイラによってインライン化される可能性があります。ここでは単に余計です。 –

答えて

2

GCC extensions not implemented yet

打ち鳴らすにはnested functionsをサポートしていません。これはあまり使用されない複雑な機能なので、すぐに実装される可能性は低いです。

maxを機能外に移動してstaticにしてください。

0

ここで、「インライン」は、「インライン定義」ではなく、「インライン置換」を意味します。 N1570によれば

:インライン関数指定子で宣言

6関数がインライン 関数です。関数をインライン関数にすると、関数 の呼び出しはできるだけ速くなることが示唆されます。 138) へのこのような提案が有効である範囲は、実装定義の です。 139)

138)、例えば、「」インライン置換「として通常の機能 呼び出し機構、」の代替を使用することによって。 ...

また、別の関数を関数定義に定義しないでください。また、inlineの代わりにstatic inlineを使用すると、あなたの人生が楽になります。

関連する問題