14.4 inline
inline 是在 C99 中引入的函数修饰符。行为上模仿了 C++ 中相同的关键字。
在你阅读解释之前,请不要假设这个关键字就是强制函数内联的。
在 C99 之前,static 修饰符经常会在下面一些场景中被使用:
- 头文件,不单包含函数声明,但有完整的函数实现,会标记为 static。
- 头文件,之后被 include 进多个翻译单元。每一个翻译单元都相当于拷贝了一份代码,但由于对应的符号是对象局部的,所以链接器不会认为这些定义会冲突。
在较大的项目中,static 关键字使编译器能够访问函数的源代码,这样使它按需对函数进行内联。显然,编译器可能会自己决定函数不进行内联。这种情况下我们就会在很多地方对函数进行拷贝。每一个文件都会去调用它们自己的拷贝,这对于程序的局部性有害,且会使可执行文件膨胀。
inline 关键字就是解决这种问题的。其正确的用法应该是下面这样:
在相关的头文件中定义一个 inline 函数,例如,
- inline int inc( int x ) { return x + 1; }
在一个翻译单元(也就是说 a.c 文件),添加外部声明
- extern inline int inc( int x );
这样你就为自己定义了一个 inc 的内部版本,虽然会在外部其它文件所引用,但本单元的函数是独立的。
■Semantics change 在 GCC 4.2.1 版本之前,inline 关键字有其它的意思,参考 [14] 来获取深入的分析。