从Linux移植到OS / X很有挑战性。我有一个嵌入在另一个函数体内的内联函数。在Linux上,gcc愉快地编译了代码,但在OS / X上,clang报告错误。
以下是代码段
$ cat inline.c
void func() {
inline int max(int a, int b) { return (a>b) ? a : b; }
int c = max(11,22);
}
在Linux上,一切都很好,
Linux $ gcc -c inline.c
Linux $$ gcc --version
gcc (Ubuntu 5.2.1-22ubuntu2) 5.2.1 20151010
然而,OS / X上的clang抱怨,
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
这是一个gcc"功能"或者有一个铿锵旗帜来启用此功能?
答案 0 :(得分:2)
GCC extensions not implemented yet
clang不支持nested functions;这是一个很少使用的复杂功能,因此不太可能很快实现。
只需将max
移出该功能,然后将其设为static
。
答案 1 :(得分:0)
此处,“内联”表示“内联替换”,而不是“内联定义”。
根据N1570:
6使用内联函数说明符声明的函数是内联函数 功能。使函数成为内联函数表明调用 功能尽可能快。 138)程度 哪些建议有效 实现定义的。 139)
138)例如,使用通常功能的替代方案 调用机制,例如''内联替换''。 ... 子>
您不应该在函数定义中定义另一个函数。此外,使用static inline
代替inline
会让您的生活更轻松。