.c文件中的C99内联函数

我在.c中定义了我的函数(没有标题声明),如下所示:


inline int func(int i) {

 return i+1;

}

然后在下面的同一文件中使用它:


...

i = func(i);

在链接期间,我得到了“对'func'的未定义引用”。为什么?


不负相思意
浏览 507回答 3
3回答

胡说叔叔

inlineC99中的模型与大多数人认为的有些不同,尤其是与C ++使用的模型不同inline这只是一个提示,使编译器不会抱怨双重定义的符号。它不能保证函数是内联的,也不能保证实际上会生成一个符号(如果需要)。要强制生成符号,您必须在定义之后添加一种实例化inline:int func(int i);通常,您会inline在头文件中包含定义,然后将其包含在几个.c文件(编译单元)中。而且,您只能在其中一个编译单元中包含上述行。您可能只看到您遇到的问题,因为您没有在编译器运行中使用优化。因此,inline将.c文件包含在您的用例中没有多大意义,最好仅使用static该用例,即使额外inline使用也不会给您带来多少好处。

Smart猫小萌

这是因为GCC处理内联函数的方式。GCC执行内联替换作为优化的一部分。要消除此错误static,请在内联之前使用。static关键字强制编译器使用static关键字强制编译器采用此内联函数,从而使程序成功编译。static inline int func(int i) { return i+1;}...i = func(i);
打开App,查看更多内容
随时随地看视频慕课网APP