关于C11标准中inline函数措辞严谨性及相关定义的技术问询
问题1:C11 6.7.4 p6与p7的表述是否冗余?
C11 6.7.4 p6明确定义:带inline函数说明符声明的函数就是inline function;而p7的表述“任何内部链接的函数都可成为inline function”并非冗余,两者侧重点完全不同:
- p6从声明形式出发,明确inline function的判定标准;
- p7从链接属性角度,给出编译器优化的许可范围——内部链接的函数(哪怕没有显式加
inline说明符),编译器也有权将其当作inline function处理(比如执行内联调用优化)。
这句话补充了“inline优化的适用范围”,避免读者误以为只有显式标记inline的函数才可能被内联,所以并非冗余。
问题2:“仅在翻译单元内可用的定义”是否等同于inline definition?改写p7是否合理?
结合C11 6.7.4 p10的内容,这个理解是正确的:
p10规定,没有带extern说明符的inline定义,不属于外部定义,无法被其他翻译单元引用——也就是“仅在当前翻译单元内可用”,这正是inline definition的核心属性之一。
但将p7改写为“任何带内部链接的inline function都拥有inline definition”并不合理:
原p7的意图是许可内部链接函数成为inline function(不管是否显式加inline),而改写后的句子针对“已经是inline function的内部链接函数”,描述其拥有inline definition的属性,完全偏离了原句的语义范围。另外,内部链接的inline function(比如static inline)确实会拥有inline definition,但这是属性推导,不是原p7要表达的核心意思。
问题3:函数是否被内联取决于inline function还是inline definition?
首先明确:C11标准中,inline本质是编译器优化建议,标准从未强制要求编译器必须内联某个函数。
至于决定因素:
- 无论是inline function(带
inline声明)还是拥有inline definition(无extern的inline定义),都只是给编译器提供优化提示,最终是否执行内联完全由编译器的优化策略决定; - 额外补充:内部链接的函数(哪怕不是inline function),因为其作用域仅限当前TU,编译器更容易进行内联优化,这也是p7表述的意义之一。
简言之,标准层面没有绑定“是否内联”与“inline function/inline definition”的必然关系,最终决策权在编译器。
内容的提问来源于stack exchange,提问作者user24723440

