gcc 和内联的奇怪行为
Strange behavior with gcc and inline
我想在头文件 (.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 的代码吗?我正在使用 gcc 4.8.5.
如果您将 foo.h 替换为
static inline int ifunc(int i)
{
return i + 1;
}
两者都可以。
声明它 extern 意味着它将在其他地方定义,这在您的原始示例中不会发生。并且优化的构建不会标记为错误,因为它已经将其优化为内联,但未优化的构建在任何 .o 文件中都找不到定义(因为它们都是用 编译的) ifunc 是 foo.h).
中定义的 extern
声明为静态内联将确保它是每个文件的本地文件(缺点是如果它不内联它,你最终会得到每个需要它的 .o 都有一个本地副本,所以不要'不要过度)。
我想在头文件 (.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 的代码吗?我正在使用 gcc 4.8.5.
如果您将 foo.h 替换为
static inline int ifunc(int i)
{
return i + 1;
}
两者都可以。 声明它 extern 意味着它将在其他地方定义,这在您的原始示例中不会发生。并且优化的构建不会标记为错误,因为它已经将其优化为内联,但未优化的构建在任何 .o 文件中都找不到定义(因为它们都是用 编译的) ifunc 是 foo.h).
中定义的 extern声明为静态内联将确保它是每个文件的本地文件(缺点是如果它不内联它,你最终会得到每个需要它的 .o 都有一个本地副本,所以不要'不要过度)。