它可以生成更小的代码.原因是inline
(相对于static inline
)将赋予函数外部链接,以便来自不同转换单元的对函数的所有调用都引用相同的逻辑函数.使用时static inline
,每个转换单元将获得该函数的唯一实例,如果编译器选择不内联,则可能会增加代码大小.(代码更清晰,没有多个相同的功能.)
你需要extern
某个地方的原因是因为它使编译器生成可以从其他翻译单元调用的函数的外部定义.没有extern
,没有生成这样的实例.无extern
例与内部联系的不同之处在于,inline
定义仅提供了对函数外部定义的"替代".外部定义必须仍然存在(即,某些转换函数必须用于extern
生成外部定义),并且编译器可以自由地使用它而不是它想要的.
这里有一些相关的标准(对于C11:ISO/IEC 9899:2011§6.7.4函数说明符,7):
具有内部链接的任何函数都可以是内联函数.对于具有外部链接的函数,以下限制适用:如果使用
inline
函数说明符声明函数,则它也应在同一转换单元中定义.如果转换单元中函数的所有文件范围声明都包含inline
函数说明符extern
,则该转换单元中的定义是内联定义.内联定义不提供函数的外部定义,也不禁止另一个转换单元中的外部定义.内联定义提供了外部定义的替代,翻译器可以使用该定义在同一翻译单元中实现对该功能的任何调用.未指定对函数的调用是使用内联定义还是使用外部定义.140)140)由于内联定义不同于相应的外部定义以及其他翻译单元中的任何其他相应内联定义,因此具有静态存储持续时间的所有相应对象在每个定义中也是不同的.
顺便说一句,inline
IMO通常不值得(作为一个提示 - 编译器仍然可以自由不内联),而不是简单地让编译器选择何时纯粹内联.对于支持链接时优化的现代编译器,如果传递正确的标志(例如,-flto
在GCC中),编译器甚至可以跨翻译单元内联函数.