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] 来获取深入的分析。


results matching ""

    No results matching ""