叮当声:C中另一个函数体中的内联函数
从Linux移植到OS/X是一项挑战。我在另一个函数体中嵌入了一个内联函数。在Linux上,gcc很高兴地编译了代码,但在OS/X上,clang报告了错误 下面是代码片段叮当声:C中另一个函数体中的内联函数,c,macos,clang,inline,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
$ 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
但是,clang on 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
这是一个gcc“特性”还是有一个响亮的标志来启用此功能
叮当声不支持;这是一个不常使用的复杂功能,因此不太可能在短期内实现
只需将max
移出函数,并将其设置为static
此处,“内联”表示“内联替换”,而不是“内联定义”
根据:
6使用内联函数说明符声明的函数是内联函数
功能。使函数成为内联函数意味着调用
函数必须尽可能快
这些建议中哪些是有效的还不清楚
实施(第139段)
138)例如,通过使用常规功能的替代品
调用机制,如“内联替换”
你不应该在函数定义中定义另一个函数。另外,使用
静态内联
而不是内联
将使您的生活更轻松。在实际代码中,您在该函数中调用了多少次max
?是的,这是一个GCC功能。不是标准的C。Clang有权反对。如果你希望你的代码是可移植的,不要这样做。而且inline
这里没有任何意义。如果您想将函数定义放在头文件中,使它们在几个.c文件中可见,那么它是一个非常有用的工具。在同一个.c文件中找到的所有内容都可以由编译器内联而不必通知,在这里这是多余的。