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_tuintmax_t相同的表达。[注:从而,比如在一个实现上,INT_MAX0x7FFF,而UINT_MAX0xFFFF,那么常量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——条件包含的更多相关文章

  1. ISO/IEC 9899:2011 条款6.10.2——源文件包含

    6.10.2 源文件包含 约束 1.一个#include指示符应该指定一个能被实现处理的头文件或源文件. 语义 2.一个预处理指示符如下形式 #    include    <h-char-se ...

  2. ISO/IEC 9899:2011 条款6.10——预处理指示符

    6.10 预处理指示符 语法 1.preprocessing-file: groupopt group: group-part group    group-part group-part: if-s ...

  3. ISO/IEC 9899:2011 条款6.10.3——宏替换

    6.10.3 宏替换 约束 1.两个替换列表是相同的,当且仅当两个替换列表中的预处理符记都具有相同的数.次序.拼写,以及空白分隔符,这里所有的空白分隔符都认为是相同的. 2.当前被定义为一个类似对象的 ...

  4. ISO/IEC 9899:2011 条款6.5.15——条件操作符

    6.5.15 条件操作符 语法 1.conditional-expression: logical-OR-expression logical-OR-expression    ?    expres ...

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. ELK Stack部署

    部署ELK Stack 官网:https://www.elastic.co 环境准备: ip hostname 服务 用户.组 192.168.20.3 node2003 kibana6.5,file ...

  2. python正则表达式(1)--特殊字符

    正则表达式—特殊表达式含义 正则表达式的字母和数字表示他们自身,但多数字母和数字前加一个反斜杠时会拥有不同的含义. 下面列出了正则表达式模式语法中的特殊元素. 1.普通字符集 1)    \w     ...

  3. 动态创建自绘的CListBox注意事项

    Create(WS_VISIBLE|WS_CHILD|LBS_NOTIFY|LBS_OWNERDRAWFIXED|LBS_HASSTRINGS|LBS_NOINTEGRALHEIGHT ,rcWnd, ...

  4. SQL操作Spark SQL--BasicSQLTestt

    object BasicSQLTest { def main(args: Array[String]): Unit = { val spark = SparkSession .builder() .a ...

  5. 使用Simian进行重复代码检测

    一.概述 Simian是一个可跨平台使用的重复代码检测工具,有商用和免费两种使用渠道,官方网址为:http://www.harukizaemon.com/simian/installation.htm ...

  6. Tensorflow细节-Tensorboard可视化-简介

    先搞点基础的 注意注意注意,这里虽然很基础,但是代码应注意: 1.从writer开始后边就错开了 2.writer后可以直接接writer.close,也就是说可以: writer = tf.summ ...

  7. B/S之大文件分段上传、断点续传

    4GB以上超大文件上传和断点续传服务器的实现 随着视频网站和大数据应用的普及,特别是高清视频和4K视频应用的到来,超大文件上传已经成为了日常的基础应用需求. 但是在很多情况下,平台运营方并没有大文件上 ...

  8. TimescaleDB1.3 的新特性——Continuous aggregates: faster queries with automatically maintained materialized views

    One characteristic of time-series data workloads is that the dataset will grow very quickly. Without ...

  9. [RN] React Native 下实现底部标签(不支持滑动切换)

    底部标签是现在App的基本菜单实现 下面分别用 createBottomTabNavigator 和 createMaterialBottomTabNavigator 两种方法分别实现底部菜单 但此两 ...

  10. 解决js加减乘除精度问题

    // 加法 const accAdd = (arg1, arg2) => {     var r1, r2, m;     try {         r1 = arg1.toString(). ...