6.7.4 函数说明符

语法

1、function-specifier:

inline

_Noreturn

约束

2、函数说明符应该只能被用在对一个函数标识符的声明中。

3、对一个含有外部连接函数的内联定义,不应该包含含有静态或线程存储周期的可修改对象的定义,并且不应该含有对带有内部连接的一个标识符的引用。[译者注:比如

static int ss = ;

extern inline void hello(int a);

inline void hello(int a)
{
static int s; // 不应该定义可修改的静态变量 s = a; ss += a; // 不应该引用具有内部连接的变量
}

这里要注意的是,所谓的“不应该”是指程序员应该尽量避免这种使用方式,但编译器实现可以允许这种写法。因为,对于上述代码片段如果是写在一个头文件(.h)中时,那么对于不同翻译单元,它们的行为可能是不同的。

]

4、在一个主机端环境,在对main函数的声明中不应该出现任何函数说明符。

语义

5、一个函数说明符可以出现多次;行为就跟只出现一次是一样的。

6、用inline函数说明符声明的一个函数是一个内联函数。将一个函数作为一个内联函数提议了,对那个函数的调用尽可能地快。[注:比如,通过对普通的函数调用机制使用一种替换,诸如“内联替换”。内联替换并不是字面上的替换,它也不创建一个新的函数。从而,比如在函数体内使用一个宏扩展,在函数体出现的那一点而不是函数被调用的那一点,使用了它所具有的定义;并且标识符引用函数体发生的作用域内的声明。同样地,函数具有一单个地址,不管内联定义除了外部定义以外还发生的次数。]

7、任一具有内部连接的函数可以是一个内联函数。对于具有外部连接的函数,要应用以下限制:如果一个函数用一个inline函数说明符,那么它也应该被定义在同一个翻译单元。如果一个翻译单元中,一个函数的所有文件作用域内的声明包含了inline函数说明符,且没有extern,那么在那个翻译单元中的定义是一个内联定义。一个内联定义并不提供对该函数的一个外部定义,并且并不禁止在另一个翻译单元提供一个外部定义。一个内联定义提供了对一个外部定义的替代品,这样一个翻译单元可以用来在同一个翻译单元中实现对该函数的任一调用。对该函数的一次调用是否使用内联定义还是使用外部定义是未指定的。[注:由于一个内联定义区别于相应的外部定义,也区别于在其它翻译单元内的内联定义,因而所有具有静态存储周期的相应对象([译者注:这些静态对象定义在内联函数中]),在每个定义中也是独立分开的。]

8、用一个_Noreturn函数说明符声明的一个函数不应该返回到其调用者。

推荐的实践

9、如果用一个_Noreturn函数说明符声明的一个函数中出现了能够返回到其调用者,那么实现应该对这种情况生成一条诊断消息。

10、例1 具有外部连接的一个内联函数的声明,可以产生一个外部定义,要么是一个仅在翻译单元内可用的定义。带有extern的一个文件作用域声明创建一个外部定义。以下例子展示了一整个翻译单元。

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); // 创建了一个外部定义 double convert(int is_fahr, double temp)
{
/* 一个翻译器可以执行内联替换 */
return is_fahr? cels(temp) : fahr(temp);
}

11、注意,对fahr的定义是一个外部定义,因为fahr也用extern声明,但对cels的定义是内联定义。因为,cels具有外部连接且被引用,一个外部定义必须出现在另一个翻译单元中(见6.9);内联定义与外部定义是有所不同的,并且任意一个都可用于函数调用。

12、例2

_Noreturn void f() {
abort(); // OK
} _Noreturn void g(int i) {
// 引发未定义的行为,如果 i <= 0
if( i > )
abort();
}

ISO/IEC 9899:2011 条款6.7.4——函数说明符的更多相关文章

  1. ISO/IEC 9899:2011 条款6.9.1——函数定义

    6.9.1 函数定义 语法 1.function-definition: declaration-specifiers    declarator    declaration-listopt     ...

  2. ISO/IEC 9899:2011 条款6.7.5——对齐说明符

    6.7.5 对齐说明符 语法 1.alignment-specifier: _Alignas    (    type-name    ) _Alignas    (    constant-expr ...

  3. ISO/IEC 9899:2011 条款6.7.2——类型说明符

    6.7.2 类型说明符 语法 1.type-specifier: void char short int long float double signed unsigned _Bool _Comple ...

  4. ISO/IEC 9899:2011 条款3——术语、定义与符号

    3. 术语.定义与符号 1.对于此国际标准的意图,应用了以下定义.其它术语是在用斜体类型或一个语法规则左侧出现的地方定义.在本国际标准中所显式定义的术语不被假定为对其它地方所定义的类似术语的隐式引用. ...

  5. ISO/IEC 9899:2011 条款5——5.2.1 字符集

    5.2.1 字符集 1.两个字符集和它们相关联的依次顺序应该被定义:写在源文件中的集合(源字符集),以及在执行环境中被解释的集合(执行字符集).每个集合此外被划分为一个基本字符集,其内容由本子条款给出 ...

  6. ISO/IEC 9899:2011 条款6.4.2——标识符

    6.4.2 标识符 6.4.2.1 通用 语法 1.identifier: identifier-nodigit identifier    identifier-nondigit identifie ...

  7. ISO/IEC 9899:2011 条款6.4.3——通用字符名

    6.4.3 通用字符名 语法 1.通用字符名: universal_character-name: \u hex-quad(四位十六进制数) \U hex-quad hex-quad hex-quad ...

  8. ISO/IEC 9899:2011 条款5——5.1.2 执行环境

    5.1.2 执行环境 1.定义了两个执行环境:独立式(freestanding)以及宿主的(hosted).在这两种情况下,当一个派定的C函数被执行环境调用时,程序就启动.所有具有静态存储周期的对象应 ...

  9. ISO/IEC 9899:2011 条款4——标准顺从

    4. 标准顺从 1.在本国际标准中,“应该”被解释为对一个实现或一个程序的要求:相反地,“不该”被解释为禁用. 2.如果违反了出现在一个强制规定或运行时强制规定之外的“应该”或“不该”要求,那么该行为 ...

随机推荐

  1. Vue过渡效果的实现

    1.Vue 过渡组件 Vue 在插入.更新或者移除 DOM 时,使用内置的过渡封装组件可以实现过渡效果 语法格式: <transition name = "xx"> & ...

  2. Kotlin构造方法详解与初始化过程分析

    在上一次https://www.cnblogs.com/webor2006/p/11192025.html已经初识了Kolin的面向对象,先来回顾一下: 介绍了primary 构造方法,其特点回忆一下 ...

  3. JDK源码那些事儿之ConcurrentLinkedDeque

    非阻塞队列ConcurrentLinkedQueue我们已经了解过了,既然是Queue,那么是否有其双端队列实现呢?答案是肯定的,今天就继续说一说非阻塞双端队列实现ConcurrentLinkedDe ...

  4. mysql 两张表字段模糊匹配--字符串拼接函数

    concat(A,B,C,...)  拼接字符串 例如concat('123','***','345')  =>123***345 SELECT concat( substr(t1.CODE, ...

  5. 01.Vue前端路由学习目标

    路由的基本概念与原理 vue-router的基本使用 vue-router嵌套路由 vue-router动态路由匹配 vue-router命名路由 vue-router编程式导航 基于vue-rout ...

  6. 常用的HTTP状态码,网站开发请求状态必备

    成功的状态码: 200 – 服务器成功返回网页 304 – 未修改 失败的状态码: 404 – 请求的网页不存在 503 – 服务器暂时不可用 500 – 服务器内部错误 下面的不是很常用,记住上面那 ...

  7. Springboot-data-jpa增删改查

    导入依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http:/ ...

  8. SIGAI机器学习第十九集 随机森林

    讲授集成学习的概念,Bootstrap抽样,Bagging算法,随机森林的原理,训练算法,包外误差,计算变量的重要性,实际应用 大纲: 集成学习简介 Boostrap抽样 Bagging算法 随机森林 ...

  9. C# winform Panel 添加 滚动条

    Detailed discussion here. Try this instead for 'only' scrolling vertical.(auto scroll needs to be fa ...

  10. PDB符号文件浏览工具介绍

    一.SymView SymView工具用来显示符号文件中包含的符号表和符号数据.目前支持微软的Visual C/C++和C#编译器产生的DBG格式的符号文件和PDB格式的符号文件. SymView提供 ...