C99引用内联函数:对XXX的未定义引用,为什么要将它放到标题中?

Qoo*_*bee 6 c

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

我已经浏览了一些关于这个问题的信息.但我无法理解为什么必须使用"extern"或"static"指定内联函数.

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

我发现一个帖子是"内联"而没有"静态"或"外部"在C99中有用吗?

这是什么意思?

如果在内联定义可见的情况下调用某些具有外部链接的函数func,则行为与调用另一个函数(例如__func,具有内部链接)的行为相同.

Ser*_* L. 11

C99中的内联语义有点混乱我不得不承认.该inline量词允许你定义一个函数的替代定义.

如果函数inline在声明和定义中都被定义为无处不在,则此定义仅在本地转换单元中有效.在C99标准中,这个定义非常模糊,但实际上大多数编译器都以类似的意义实现它static inline.基本上只是inline覆盖任何其他链接单元中具有相同名称的任何其他函数.因此,如果将函数声明为只inline在头文件中,编译器将期望在同一编译单元中找到它的定义,如果不是,则会在稍后给出错误.

现在,如果一个函数既可以内联并且可以在其他翻译单元中使用,那么它需要extern在头文件声明中定义.然后编译器不会仅在当前编译单元中查找它.

static inline到目前为止,它是目前最便携的定义,并且仅限于当前的翻译单元.这通常在标题中与实际函数定义一起找到.


Jen*_*edt 7

inline 函数属于标题,以便所有编译单元都能看到代码.

如果无论出于何种原因无法内联代码,最终的可执行文件必须具有可链接的函数的一个版本.这只需要在一个编译单元(.c文件)中"实例化"

extern inline void toto(int bla);
Run Code Online (Sandbox Code Playgroud)

强制符号包含在该单元中.

你可以在这里找到更多相关信息