C文件中的C99内联函数
我在.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
也不会给你多less钱。
C99内联语义经常被误解。 inline
说明符有两个目的:
首先,作为static inline
和外extern inline
声明的编译器提示。 如果删除说明符,语义保持不变。
其次,在内inline
(即不带static
或外联)的情况下,提供内联定义作为外部定义的替代,而外联定义必须存在于不同的翻译单元中。 不提供外部的是未定义的行为,这通常会performance为链接失败。
如果你想把一个函数放到一个共享库中,这个特别有用,但是也可以使这个函数体可用于优化(例如内联或特化)。 假设一个足够聪明的编译器,这可以让你恢复C ++模板的许多好处,而无需跳过预处理器的箍。
请注意,它比我在这里描述的有点混乱,因为具有另一个文件范围的非内联外部声明将触发Jens的答案中所述的第一种情况,即使定义本身是inline
而不是外extern inline
。 这是devise的,所以你可以在一个头文件中有一个内联的定义,你可以通过为外部声明添加一行来包含在源文件中。