ISO/IEC 9899:2011 条款6.7.4——函数说明符
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——函数说明符的更多相关文章
- ISO/IEC 9899:2011 条款6.9.1——函数定义
6.9.1 函数定义 语法 1.function-definition: declaration-specifiers declarator declaration-listopt ...
- ISO/IEC 9899:2011 条款6.7.5——对齐说明符
6.7.5 对齐说明符 语法 1.alignment-specifier: _Alignas ( type-name ) _Alignas ( constant-expr ...
- ISO/IEC 9899:2011 条款6.7.2——类型说明符
6.7.2 类型说明符 语法 1.type-specifier: void char short int long float double signed unsigned _Bool _Comple ...
- ISO/IEC 9899:2011 条款3——术语、定义与符号
3. 术语.定义与符号 1.对于此国际标准的意图,应用了以下定义.其它术语是在用斜体类型或一个语法规则左侧出现的地方定义.在本国际标准中所显式定义的术语不被假定为对其它地方所定义的类似术语的隐式引用. ...
- ISO/IEC 9899:2011 条款5——5.2.1 字符集
5.2.1 字符集 1.两个字符集和它们相关联的依次顺序应该被定义:写在源文件中的集合(源字符集),以及在执行环境中被解释的集合(执行字符集).每个集合此外被划分为一个基本字符集,其内容由本子条款给出 ...
- ISO/IEC 9899:2011 条款6.4.2——标识符
6.4.2 标识符 6.4.2.1 通用 语法 1.identifier: identifier-nodigit identifier identifier-nondigit identifie ...
- ISO/IEC 9899:2011 条款6.4.3——通用字符名
6.4.3 通用字符名 语法 1.通用字符名: universal_character-name: \u hex-quad(四位十六进制数) \U hex-quad hex-quad hex-quad ...
- ISO/IEC 9899:2011 条款5——5.1.2 执行环境
5.1.2 执行环境 1.定义了两个执行环境:独立式(freestanding)以及宿主的(hosted).在这两种情况下,当一个派定的C函数被执行环境调用时,程序就启动.所有具有静态存储周期的对象应 ...
- ISO/IEC 9899:2011 条款4——标准顺从
4. 标准顺从 1.在本国际标准中,“应该”被解释为对一个实现或一个程序的要求:相反地,“不该”被解释为禁用. 2.如果违反了出现在一个强制规定或运行时强制规定之外的“应该”或“不该”要求,那么该行为 ...
随机推荐
- java(Hello World) 常量 变量和注意事项
一.java的入门程序 java语言的简单介绍 关于java语言的特点:(1) 简单性和c++相比,java没有头文件.指针.运算符重载等,java语言相当于是一个比较纯净版的c++.(2) 面对对象 ...
- 使用Nuget生成类库
背景: 为了开始ITOO项目,我们先学习了一些基本知识,这些就是一个基本知识,这实现的是一种封装的思想,将方法打包,这样我们就可以在其他系统中直接引用而需要再耗费人力和财力去做,真正实现了高效率 ...
- 2019-2020-1 20199301《Linux内核原理与分析》第六周作业
第五章 系统调用的三层机制(下) 1.给MenuOS增加命令 代码如下: rm -rf menu git clone http://github.com/mengning/menu.git make ...
- Nginx请求处理流程
因为 Nginx 运行在企业内网的最外层也就是边缘节点,那么他处理的的流量是其他应用服务器处理流量的数倍,甚至几个数量级,我们知道任何一种问题在不同的数量级下,他的解决方案是完全不同的,所以在 Ngi ...
- .net框架-数组(Array)& ArrayList & List
数组(Array)特点: 初始化时规定长度 元素类型相同 数据存储连续,效率高 System.Collections.ArrayList : 初始化时无需规定长度,长度随存储的数据动态扩充与收缩 元素 ...
- spring源码分析系列 (15) 设计模式解析
spring是目前使用最为广泛的Java框架之一.虽然spring最为核心是IOC和AOP,其中代码实现中很多设计模式得以应用,代码看起来简洁流畅,在日常的软件设计中很值得借鉴.以下是对一些设计模式的 ...
- Dubbo源码分析(2):ServiceBean
ServiceBean时序图
- Java - 框架之 SSH 整合
代码获取 十四. ssh 整合1 - 包 1. Struts jar 包 - Struts-2.xx\apps\stutrs2-blank\WEB-INF ...
- 入门node.js
我们现在要做一个简单的h5应用:包含登录.注册.修改密码.个人中心主页面.个人中心内页修改名称.个人中心修改手机号码. 第一步:工具安装,我选择了能够辅助我们快速开发的light开发工具 1. lig ...
- SP1825 【FTOUR2 - Free tour II】
# \(SP1825\) 看到没有人用老师的办法,于是自己写一下思路 思路第一步:排除旧方法 首先这道题和\(4178\)不一样,因为那道题是计数,而这道题是求最值,最值有个坏处,就是对于来自相同子树 ...