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. 查看zookeeper版本

    命令 echo stat|nc localhost 2181 zookeeper@kafka-zookeeper-0:/$ echo stat|nc localhost 2181 Zookeeper ...

  2. JanusGraph多图配置 (cassandra)

    JanusGraph多图配置目的 :一个端口开启后可根据句柄操作多个图 .(cassandra存储后端) 1.GremlinServer多图配置 服务器gremlin-server.yaml中可以设置 ...

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

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

  4. django项目使用layui插件给网站设置一个日历挂件,很简单实用。

    进入https://www.layui.com/首页下载layui文件 下载解压后把文件放在static静态文件中, html页面引入css和js <link rel="stylesh ...

  5. treegrid 折叠全部节点

    $(".easyui-treegrid").treegrid({ url: '@Url.Action("GetDataDictionaryList", &quo ...

  6. vue 弹框

    弹框展示: 代码: <template> <div> <el-col :span="9" style="text-align: right; ...

  7. vscode——如何对MarkDown文件进行预览

    前言 一般都是用Typora直接进行编写了,今天恰好在vs中写完代码,就需要编辑文档,这里就记录下如何预览吧 步骤 ctrl+shift+p打开命令面板,然后输入markdowm->选择在侧边打 ...

  8. spring配置文件ApplicationContext.xml里面class等没有提示功能

    实现效果: 解决方法: windows–>preference—>myeclipse—>files and editors–>xml—>xmlcatalog 点击add ...

  9. 关于Java的i++和++i的区别

    之前对于 i++ 和 ++i 的理解就是: int i=1,a=0; 1.i++ 先运算在赋值,例如 a=i++,先运算a=i,后运算i=i+1,所以结果是a==1 2.++i 先赋值在运算,例如 a ...

  10. python的any()函数

    any()函数的参数是一个可迭代对象,其中的一个元素有一个为真,则any()函数返回真,除非全部为假的时候才返回假. aaa=[,,,] print(any(aaa)) 返回:false