在其他文件中声明的GCC和内联C函数(“函数体不可用”问题)

在其他文件中声明的GCC和内联C函数(“函数体不可用”问题),c,gcc,C,Gcc,我对不同文件中定义的内联函数提出了一个奇怪的问题。考虑下面的场景。 总而言之,c: #include "inline.h" int main(void) { int i = 0; for (i = 0; i<=100000; i++) { omfg(i); } return 0; } 在inline.c中: #include <stdio.h> inline int omfg(unsigned int num) { i

我对不同文件中定义的内联函数提出了一个奇怪的问题。考虑下面的场景。

总而言之,c:

#include "inline.h"
int main(void) {
    int i = 0;
    for (i = 0; i<=100000; i++) {
        omfg(i);
    }
    return 0;
 }
在inline.c中:

#include <stdio.h>
inline int omfg(unsigned int num) {
    int i = 0;
    for (i = 0; i<= 10; i++) {
        printf(".");
        num++;
    }
    return num;
 }
我得到:

main.c: In function 'main':
inline.h:2: warning: inlining failed in call to 'omfg': function body not available
main.c:7: warning: called from here

我做错了什么?我应该以不同的方式声明
omfg()
?这相当令人费解…

如果要编译此函数,必须将内联函数的实现放在头文件中。

将实现移到头文件中。你可以先声明函数,然后在下面定义它,或者甚至在头的底部包含一个特殊的文件,比如inline.inl来隐藏它,但是如果要内联的话,基本上函数定义必须是可用的。

我不得不说,这在某些方面是一个非常没有帮助的评论。如果您在头文件中定义了一些内容,然后执行Objective-C风格的编译,那么它将出错,因为您的函数是乘法声明的。所以然后呢?实际上,我真的很好奇这个问题的解决办法是什么。什么是Objective-C风格的编译?人们只能在函数声明中始终使用属性,但在标题中使用定义/正文重新声明会导致重新定义
omfg
,该怎么办?我认为对于最新的编译器来说是这样的。
$ gcc inline.c main.c -o binary -Wall -Winline -Wextra -O2
main.c: In function 'main':
inline.h:2: warning: inlining failed in call to 'omfg': function body not available
main.c:7: warning: called from here