clang问题:C中另一个函数体内的内联函数

时间:2016-08-05 05:56:04

标签: c macos clang inline

从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"功能"或者有一个铿锵旗帜来启用此功能?

2 个答案:

答案 0 :(得分:2)

  

GCC extensions not implemented yet

     

clang不支持nested functions;这是一个很少使用的复杂功能,因此不太可能很快实现。

只需将max移出该功能,然后将其设为static

答案 1 :(得分:0)

此处,“内联”表示“内联替换”,而不是“内联定义”。

根据N1570

  

6使用内联函数说明符声明的函数是内联函数   功能。使函数成为内联函数表明调用   功能尽可能快。 138)程度   哪些建议有效   实现定义的。 139)

     

138)例如,使用通常功能的替代方案   调用机制,例如''内联替换''。 ...

您不应该在函数定义中定义另一个函数。此外,使用static inline代替inline会让您的生活更轻松。