Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
叮当声:C中另一个函数体中的内联函数_C_Macos_Clang_Inline - Fatal编程技术网

叮当声:C中另一个函数体中的内联函数

叮当声: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

从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
但是,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文件中找到的所有内容都可以由编译器内联而不必通知,在这里这是多余的。