我想在头文件(.h)中定义一个内联函数,该文件可以包含在许多源文件(.c)中。这是一个带有1个标头和2个源文件的最小示例:
头文件foo.h
int ifunc(int i);
extern inline
int
ifunc(int i)
{
return i + 1;
}
源代码文件:foo.c
#include <stdio.h>
#include "foo.h"
int foo2(int i);
int main()
{
printf("%d\n", foo2(1));
return 0;
}
源代码文件foo2.c
#include "foo.h"
int foo2(int i)
{
return ifunc(i);
}
问题
在进行优化编译时,
gcc -g -Wall -O2 -o foo foo.c foo2.c
$ ./foo
2
一切正常。但是,当我关闭优化时,会出现此错误:
gcc -g -Wall -o foo foo.c foo2.c
/tmp/cc3OrhO9.o: In function `foo2':
foo2.c:5: undefined reference to `ifunc'
有人可以解释一下解决方法,以便我可以在有-O2和没有-O2的情况下运行代码吗?我正在使用gcc 4.8.5。
答案 0 :(得分:1)
如果将foo.h替换为
static inline int ifunc(int i)
{
return i + 1;
}
两个都可以。 声明 extern 意味着它将在其他地方定义,在您的原始示例中不会发生。优化的构建不会将其标记为错误,因为它已经对其进行了优化以使其内联,但是未优化的构建在任何.o文件中均未找到定义(因为它们都是使用 ifunc < / em>是foo.h中定义的extern。
声明为静态内联将确保该文件在每个文件中都是本地文件(不利之处在于,如果不对它进行内联,则将得到每个需要该文件的.o本地副本,因此请不要过度使用)它)。