C99 引用内联函数 : undefined reference to XXX and why should I put it to header?

标签 c

gcc是否完全符合C99标准规定的内联模型?

我浏览了一些关于这个问题的信息。但我不明白为什么内联函数必须用“extern”或“static”指定。

在.c 文件中,调用同一翻译单元中定义的内联函数会导致错误。编译器行为的原因是什么?

我找到了一个帖子 Is “inline” without “static” or “extern” ever useful in C99?

这是什么意思?

If a call to some function func with external linkage occurs where an inline definition is visible, the behavior is the same as if the call were made to another function, say __func, with internal linkage.

最佳答案

我不得不承认,C99 中的内联语义有点令人困惑。 inline 量词允许您定义函数的替代定义。

如果一个函数在声明和定义中都被定义为 inline,那么这个定义只在本地翻译单元中有效。在 C99 标准中,这个定义非常模糊,但实际上大多数编译器以与 static inline 类似的方式实现它。本质上只是 inline 覆盖任何其他链接单元中具有相同名称的任何其他函数。因此,如果您在 header 中将函数声明为 inline,编译器将期望在同一编译单元中找到它的定义,如果找不到,稍后会给您一个错误。

现在,如果一个函数既要内联又要在其他翻译单元中可用,则需要在 header 声明中将其定义为 extern。那么编译器就不会只在当前编译单元中查找了。

static inline 是目前最便携的定义,并且受限于当前的翻译单元。这通常与实际函数定义一起出现在 header 中。

关于C99 引用内联函数 : undefined reference to XXX and why should I put it to header?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18635665/

相关文章:

c - 当N个socket与一个监听socket连接时,epoll_wait()会通知进程多少次?

用于解析日期时间的 C 库

c - 读取/处理程序

c++ - 播放传入的视频流

c - stm32下使用scanf函数的问题

划分两个 float 时的 C 怪异行为

完成共同工作后取消 POSIX 线程

使用 MPI 连接文本文件

c - 不兼容指针赋值的技术合法性

c - GCC 4.7.0 运行时问题 - 接收信号 11 (SigSegv)