6.7.5 函数说明符
可用说明符
- 函数说明符只有两个:
inline_Noreturn
约束
函数说明符只能用于函数标识符的声明。
具有外部链接的
inline函数定义,其函数体内不得:- 定义可修改的静态存储期或线程存储期对象;
- 引用具有内部链接的标识符。
在宿主环境中,
main的声明里不得出现函数说明符。
语义
函数说明符可以重复写;效果与只写一次相同。
inline表示该函数是内联函数,含义是“建议实现尽量让调用更快”,但是否真的做内联替换,由实现定义。任何具有内部链接的函数都可以是内联函数。
对具有外部链接的函数,如果声明里出现了
inline,那么同一翻译单元里还必须给出该函数的定义。若某翻译单元中该函数的所有文件作用域声明都带
inline且不带extern,则该翻译单元中的定义是内联定义。内联定义本身不提供外部定义,也不阻止别的翻译单元再提供一个外部定义。
对同一调用而言,最终用的是当前翻译单元里的内联定义,还是别处的外部定义,标准规定为未指定。
_Noreturn表示函数不应返回给调用者。[[noreturn]]属性提供类似语义;_Noreturn作为函数说明符已经属于将来可能移除的旧特性。
示例理解
- 下面这个翻译单元里,
fahr因为又有一条extern声明,所以形成外部定义;cels则只是内联定义:
c
inline double fahr(double t) { return (9.0 * t) / 5.0 + 32.0; }
inline double cels(double t) { return (5.0 * (t - 32.0)) / 9.0; }
extern double fahr(double);1
2
3
2
3
- 实现应当对“看起来可能返回”的
_Noreturn函数给出诊断。