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的,所以你可以在一个头文件中有一个内联的定义,你可以通过为外部声明添加一行来包含在源文件中。