gcc - gcc和内联的奇怪行为

标签 gcc compiler-errors inline

我想在头文件(.h)中定义一个内联函数,该文件可以包含在许多源文件(.c)中。这是一个带有1个 header 和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。

最佳答案

如果将foo.h替换为

static inline int ifunc(int i)
{
  return i + 1;
}

两者都会起作用。
将其声明为 extern 意味着它将在其他地方定义,在您的原始示例中不会发生。并且优化的构建不会将其标记为错误,因为它已经对其进行了优化以使其内联,但是未优化的构建在任何.o文件中均未找到定义(因为它们都是以ifunc作为extern进行编译的,在foo.h中定义)。

声明为静态内联将确保该文件在每个文件本地(不利之处在于,如果未内联该文件,则最终会得到每个需要该文件具有本地副本的.o,因此不要过度使用它)。

关于gcc - gcc和内联的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53839685/

相关文章:

java - 在构造函数中使用数组常量时出现编译器错误

compiler-errors - D 和 SDL - 函数未定义

c++ - C++中的 “inline”关键字

linux - 遗留系统上新 libstdc++ 中的段错误

c++ - Gcc 中是否有命令来获取关键字(或函数等)的描述?

c - printf 和 long double

c - gcc 无效的命令行选项

css - 如何使用 :before and :after 创建内联样式

c++ - "inline"是否隐含在类定义中定义的 C++ 成员函数中

c - C 中的函数指针