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——条件包含的更多相关文章

  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. Python的插件化开发概述

    Python的插件化开发概述 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.插件化开发 动态导入: 运行时,根据用户需求(提供字符串),找到模块的资源动态加载起来. 1> ...

  2. 从输入 URL 到页面展示到底发生了什么?

    1.输入地址 当我们开始在浏览器中输入网址的时候,浏览器其实就已经在智能的匹配可能得 url 了,他会从历史记录,书签等地方,找到已经输入的字符串可能对应的 url,然后给出智能提示,让你可以补全ur ...

  3. Collaborative Knowledge base Embedding (CKE)

    Collaborative Knowledge base Embedding (CKE) 在推荐系统中存在着很多与知识图谱相关的信息,以电影推荐为例: 结构化知识(structural knowled ...

  4. Kotlin属性引用详解

    继续来学习Kotlin反射相关的,这次主要是跟反射属性相关的东东. 属性引用(Property Reference): 属性引用的用法与函数(方法)引用的用法是完全一致,都是通过::形式来引用的.下面 ...

  5. BZOJ1123 [POI2008]BLO(割点判断 + 点双联通缩点size)

    #include <iostream> #include <cstring> #include <cstdio> using namespace std; type ...

  6. 利用avicap32.dll实现的实时视频传输

    直接上代码吧! 在窗体上调用的类: using System; using System.Collections.Generic; using System.ComponentModel; using ...

  7. 让更多浏览器支持html5元素的简单方法

    当我们试图使用web上的新技术的时候,旧式浏览器总是我们心中不可磨灭的痛!事实上,所有浏览器都有或多或少的问题,现在还没有浏览器能够完整的识别和支持最新的html5结构元素.但是不用担心,你依然可以在 ...

  8. Mybatis框架-update节点元素的使用

    今天我们学习一下mybatis框架中的update节点元素的使用 需求:修改用户表中的一条数据记录,修改编号为21的用户的密码 UserMapper.xml UserMapper.java 编写测试方 ...

  9. 2020年假期sql excel文件 获取

    下载地址: https://files.cnblogs.com/files/shmily3929/2020.zip 说明:sql 不区分节假期和周六周末   excel文件区分节假日和周六周末

  10. 15-ESP8266 SDK开发基础入门篇--上位机串口控制 Wi-Fi输出PWM的占空比,调节LED亮度,上位机程序编写

    https://www.cnblogs.com/yangfengwu/p/11104167.html 先说一下整体思路哈.. 咱滑动的时候 会进入这个,然后咱呢不直接从这个里面写发送 因为这样的话太快 ...