繁体   English   中英

.c 文件中的 C99 内联函数

[英]C99 inline function in .c file

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

inline int func(int i) {
 return i+1;
}

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

...
i = func(i);

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

C99 中的inline模型与大多数人认为的有点不同,特别是与 C++ 使用的不同

inline只是一个提示,以便编译器不会抱怨双重定义的符号。 如果需要,它不保证函数是内联的,也不保证实际上生成符号。 要强制生成符号,您必须在内inline定义之后添加一种实例化:

int func(int i);

通常,您会在头文件中包含inline定义,然后将其包含在多个 .c 文件(编译单元)中。 并且您只会在编译单元之一中包含上述行。 您可能只会看到您遇到的问题,因为您没有对编译器运行进行优化。

因此,您在 .c 文件中使用inline用例没有多大意义,最好为此使用static ,即使额外的inline也不会给您带来太多好处。

C99 内联语义经常被误解。 inline说明符有两个用途:

首先,作为static inlineextern inline声明的编译器提示。 如果删除说明符,语义将保持不变。

其次,在原始inline (即没有staticextern )的情况下,提供内联定义作为外部定义的替代,外部定义必须存在于不同的翻译单元中。 不提供外部是未定义的行为,通常表现为链接失败。

如果您想将一个函数放入一个共享库,同时又使函数体可用于优化(例如内联或特化),这将特别有用。 假设编译器足够智能,这允许您恢复 C++ 模板的许多好处,而无需跳过预处理器。

请注意,它比我在此处描述的更混乱,因为具有另一个文件范围的非内联外部声明将触发 Jens 的回答中描述的第一种情况,即使定义本身是inline而不是extern inline 这是设计使然,因此您可以在头文件中有一个内联定义,您可以通过为外部声明添加一行来将其包含到提供外部定义的源文件中。

这是因为 GCC 处理内联函数的方式。 GCC 执行内联替换作为优化的一部分

要消除此错误,请在内联之前使用static 使用static关键字强制编译器内联此函数,从而使程序编译成功。

static inline int func(int i) {
 return i+1;
}
...
i = func(i);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM