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 ...
随机推荐
- golang的channel实现
golang的channel实现位于src/runtime/chan.go文件.golang中的channel对应的结构是: // Invariants: // At least one of c.s ...
- div折角~~~
代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title ...
- linux内核makefile概览
linux内核makefile概览 本博客参照内核官方英文文档 linux的内核makefile主要用于编译整个内核源码,按照用户的需求生成各种目标文件,对于用户来说,编译内核时非常简单的,只需要几个 ...
- C#WinForm无边框窗体移动----模仿鼠标单击标题栏移动窗体位置
C#WinForm无边框窗体移动方法.模仿鼠标单击标题栏移动窗体位置 这里介绍俩种办法 方法一:直接通过修改窗体位置从而达到移动窗体的效果 方法二:直接伪装发送单击任务栏消息,让应用程序误以为单击任务 ...
- 如果在使用谷歌的gson的时候,在返回时间类型的数据的时候,
可能会出现在long类型的时间后面多3个0 如下图所示 可以自己创建一个json序列化的类 public class Date2LongSerializer extends JsonSerialize ...
- background-image:url为空引发的两次请求问题
参考文章: https://blog.csdn.net/jsjhushilei/article/details/51101014 1.Nicholas 在 2009 年就开始推动各浏览器厂商,现在看起 ...
- dt系统中tag如何使用like与%来进行模糊查询
在destoon中,如果一个品牌的详细显示页,如果要显示与品牌相关的供应的话,可以通过查询标题中带有品牌关键字的这一条件来进行查询,但是经过测试发现不能正确解析, 然后查看文件的源文件,发现 {tag ...
- 深度学习Keras框架笔记之激活函数详解
激活函数也是神经网络中一个很重的部分.每一层的网络输出都要经过激活函数.比较常用的有linear,sigmoid,tanh,softmax等.Keras内置提供了很全的激活函数,包括像LeakyReL ...
- Linux——CentOS7没有第二张网卡的配置信息
前言 为了一个实验做测试,在VMware中配置了环境,但是配置了双网卡后发现第二张网卡没有配置文件. 都是些基本命令就不写了,图里也有. 系统 : CentOS7.6 步骤 查看网卡信息 使用ip a ...
- [Flutter] Style a message chat style-ish bubble
const kOtherBubblePointer = BorderRadius.only( topRight: Radius.circular(30), bottomLeft: Radius.cir ...