ISO/IEC 9899:2011 条款6.10.1——条件包含
6.10.1 条件包含
约束
1、控制条件包含的表达式应该是一个整数常量表达式,除了:标识符(包括那些词法上与关键字相同的)被解析为以下所描述的;[注:因为控制常量表达式在翻译阶段4期间被计算,所以所有标识符要么是宏名,要么不是宏名——它们不会是关键字、枚举常量等等。]并且它可以包含单目操作符表达式形式
defined identifier
或
defined ( identifier )
上述形式将被计算为1,如果标识符当前被定义为一个宏名(即,如果它已被预定义,或者如果如果它已经属于一个#define预处理指示符,而没有一个干涉的#undef指示符带有相同所属标识符),如果标识符当前没有被定义为一个宏名,那么被计算为0。
2、在所有宏替换已经发生之后,每个仍然保留的预处理符记(在将变为控制表达式的预处理器符记列表中)应该是一个符记在词法上的形式(6.4)。
语义
3、以下形式的预处理指示符
# if constant-expression new-line groupopt
# elif constant-expression new-line groupopt
检查控制常量表达式是否计算为非零。
4、在计算之前,将变为控制常量表达式的预处理符记列表中的宏调用被替换(除了那些用defined单目操作符修饰的宏名),正如以正常文本的形式。如果符记defined以此替换过程作为一个结果生成,或是使用defined单目操作符并不匹配在宏替换之前的两个指定形式的其中之一,那么行为是未定义的。在所有宏扩展进行替换之后,以及defined单目操符已被执行,所有剩余的标识符(包括那些词法上与关键字相同的)用预处理数字0代替,然后每个预处理符记被转换为一个符记。结果符记由控制常量表达式构成,控制常量表达式根据6.6的规则进行计算。出于此符记转换和计算的目的,所有带符号整数类型以及所有无符号整数类型行为就好比它们具有分别与定义在头文件<stdint.h>中的intmax_t和uintmax_t相同的表达。[注:从而,比如在一个实现上,INT_MAX是0x7FFF,而UINT_MAX是0xFFFF,那么常量0x8000是带符号的并且在一个#if表达式内是个正数,即使它在翻译阶段7中将可能是一个无符号数。]这包括了解析字符常量,它可能涉及将转义序列转换为执行字符集成员。当一个相同字符常量在一个表达式中发生时,这些字符常量的数值是否匹配所获得的值(而不是在#if或#elif指示符内的)是实现定义的。[注:从而,在#if指示符以及if语句后面的常量表达式不能保证在以下两个上下文中计算到相同的值:
#if 'z' - 'a' == 25
if ('z' - 'a' == )
]
同时,一个单字符的字符常量是否可以具有一个负数值也是由实现定义的。
5、以下形式的预处理指示符
# ifdef identifier new-line groupopt
# ifndef identifier new-line groupopt
检查该标识符当前是否被定义为一个宏名。它们的条件分别等价于#if defined identifier 和 #if !defined identifier。
6、每个指示符的条件按次序检查。如果它被计算为假(零),那么它所控制的组被跳过:指示符仅通过判定指示符的名字按次序处理,以保持对嵌套条件层级的追踪;剩下的指示符预处理被忽略,正如组内的其它预处理符记一样。只有第一个控制条件的组计算为真(非零)的组被处理。如果这些条件都不为真,并且有一个#else指示符,那么所有组一直到#endif都被跳过。[注:正如语法所指示的,一个预处理符记在终结换行符之前不应该跟在#else或#endif指示符的后面。]
ISO/IEC 9899:2011 条款6.10.1——条件包含的更多相关文章
- ISO/IEC 9899:2011 条款6.10.2——源文件包含
6.10.2 源文件包含 约束 1.一个#include指示符应该指定一个能被实现处理的头文件或源文件. 语义 2.一个预处理指示符如下形式 # include <h-char-se ...
- ISO/IEC 9899:2011 条款6.10——预处理指示符
6.10 预处理指示符 语法 1.preprocessing-file: groupopt group: group-part group group-part group-part: if-s ...
- ISO/IEC 9899:2011 条款6.10.3——宏替换
6.10.3 宏替换 约束 1.两个替换列表是相同的,当且仅当两个替换列表中的预处理符记都具有相同的数.次序.拼写,以及空白分隔符,这里所有的空白分隔符都认为是相同的. 2.当前被定义为一个类似对象的 ...
- ISO/IEC 9899:2011 条款6.5.15——条件操作符
6.5.15 条件操作符 语法 1.conditional-expression: logical-OR-expression logical-OR-expression ? expres ...
- ISO/IEC 9899:2011 条款3——术语、定义与符号
3. 术语.定义与符号 1.对于此国际标准的意图,应用了以下定义.其它术语是在用斜体类型或一个语法规则左侧出现的地方定义.在本国际标准中所显式定义的术语不被假定为对其它地方所定义的类似术语的隐式引用. ...
- ISO/IEC 9899:2011 条款5——5.2.1 字符集
5.2.1 字符集 1.两个字符集和它们相关联的依次顺序应该被定义:写在源文件中的集合(源字符集),以及在执行环境中被解释的集合(执行字符集).每个集合此外被划分为一个基本字符集,其内容由本子条款给出 ...
- ISO/IEC 9899:2011 条款4——标准顺从
4. 标准顺从 1.在本国际标准中,“应该”被解释为对一个实现或一个程序的要求:相反地,“不该”被解释为禁用. 2.如果违反了出现在一个强制规定或运行时强制规定之外的“应该”或“不该”要求,那么该行为 ...
- 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 ...
随机推荐
- 数据库开发-pymysql详解
数据库开发-pymysql详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Python支持的MySQL驱动 1>.什么是驱动 与MySQL通信就是典型的CS模式.Se ...
- robotframework+Python3.7 接口自动化测试
具体的测试用例,password,channel,resultCode传给接口描述 集成了一些常见的测试接口方法 1. Get请求下,
- 关闭firefox火狐浏览器下载完成时自动扫描(49.0.2以后版本)
本人自己找到的方法,亲测有效,如下:1.在火狐浏览器地址里输入about:config回车,可能会提示“这可能使质量保证失效”,点击[我了解此风险!]2.在搜索框里输入browser.safebrow ...
- 【实战3】记一次内网中反弹shell的艰难历程
# 0x00 前言 最近在客户现场对内网服务器进行渗透测试,发现了大量的弱口令,本次历程就是从这里开始··· # 0x01 弱口令 对目标ip进行端口扫描,开放端口为80,445,1433,3389- ...
- AbsInt — 确保代码安全的性能/资源分析工具套件
德国AbsInt公司是一家安全苛求软件研发.确认.验证和认证工具链的供应商,能够为客户提供完整的确保代码安全的性能分析工具套件以及软件分析.验证.确认和编译器技术相关咨询服务.AbsI ...
- poj3268 Silver Cow Party(最短路)
非常感谢kuangbin专题啊,这道题一开始模拟邻接表做的,反向边不好处理,邻接矩阵的话舒服多了. 题意:给n头牛和m条有向边,每头牛1~n编号,求所有牛中到x编号去的最短路+回来的最短路的最大值. ...
- 微信小程序和APP优劣势大对比
小程序的优势: 1. 无需下载,随走随关 2. 功能丰富,体验更简便 3. 接口众多,可以进行不断的开发 4. 流量入口大,背靠日活9.6亿的微信 5. 有强大的微信生态环境 小程序对比APP的好处: ...
- Django REST framework —— 认证组件源码分析
我在前面的博客里已经讲过了,我们一般编写API的时候用的方式 class CoursesView(ViewSetMixin,APIView): pass 这种方式的有点是,灵活性比较大,可以根据自己的 ...
- 深度学习Keras框架笔记之Activation类使用
使用 keras.layers.core.Activation(activation) Apply an activation function tothe input.(貌似是把激活函数应用到输入数 ...
- Python连接oracle数据库 例子一
step1:下载cx_Oracle模块,cmd--pip install cx_Oracle step2: 1 import cx_Oracle #引用模块cx_Oracle 2 conn=cx_Or ...