6.10 预处理指示符

语法

1、preprocessing-file:

groupopt

group:

group-part

group    group-part

group-part:

if-section

control-line

text-line

#    non-directive

if-section:

if-group    elif-groupsopt    else-groupopt    endif-line

if-group:

#    if    constant-expression    new-line    groupopt

#    ifdef    identifier    new-line    groupopt

#    ifndef    identifier    new-line    groupopt

elif-groups:

elif-group

elif-groups    elif-group

elif-group:

#    elif    constant-expression    new-line    groupopt

else-group:

#    else    new-line    groupopt

endif-line:

#    else    new-line

control-line:

#    include    pp-tokens    new-line

#    define    identifier    replacement-list    new-line

#    define    identifier    lparen    identifier-listopt    )    replacement-list    new-line

#    define    identifier    lparen    ...    )    replacement-list    new-line

#    define    identifier    lparen    identifier-list    ,    ...    )    replacement-list    new-line

#    undef    identifier    new-line

#    line    pp-tokens    new-line

#    error    pp-tokensopt    new-line

#    pragma    pp-tokensopt    new-line

#    new-line

text-line:

pp-tokensopt    new-line

non-directive:

pp-tokens    new-line

lparen:

一个(字符,没有空白符立即放在它之前

replacement-list:

pp-tokensopt

pp-tokens:

preprocessing-token

pp-tokens    preprocessing-token

new-line:

换行字符

描述

2、一个预处理指示符由一串预处理满足以下约束的预处理符记组成:在序列中的第一个符记是一个 # 预处理符记,(在翻译阶段4的开头)它要么是在源文件中的第一个字符(可选地,在不包含换行字符的空白符之后),要么跟在至少包含一个换行字符的空白符之后。在该序列中的最后一个符记是跟在第一个符记之后的第一个换行字符。[注:从而,预处理器指示符通常被称为“行”。这些“行”不具有其它语法意义,由于所有空白符都是等价的,除了在预处理期间的某些情况下(比如见6.10.3.2中的#字符串字面量创建操作符)。]一个换行字符终结预处理指示符,即使它在一个类似函数的宏的调用内发生。

3、一个文本行不应该用一个 # 预处理符记开头。一个非指示符不应该以出现在语法中的任何指示符名开头。

4、当一个组被跳过(6.10.1)时,指示符语法对于允许任一序列的预处理指示符在指示符名与跟在其后的换行字符之间发生是松弛的。

约束

5、在一个预处理符记内,预处理器符记之间应该出现的仅有的空白字符(从引入#预处理符记到用于终结的换行字符之前)是空格与水平制表符。

语义

6、实现可以根据条件处理并跳过源文件片段,包括其它源文件,以及代替宏。这些特性称为预处理,因为概念上它们在产生翻译单元的翻译之前发生。

7、在一个预处理指示符内的预处理符记不属于宏扩展,除非在其它地方阐明。

8、例 在以下代码片段中

#define EMPTY
EMPTY # include <file.h>

在第二行的预处理符记序列不是一个预处理指示符,因为它并没以一个 # 在翻译阶段4开头,即使它在宏EMPTY被代替后会如此。

6.10.1 条件包含

6.10.2 源文件包含

6.10.3 宏替换

6.10.4 行控制

6.10.5 错误指示符

6.10.6 pragma指示符

6.10.7 空指示符

6.10.8 预定义的宏名

6.10.9 Pragma操作符

ISO/IEC 9899:2011 条款6.10——预处理指示符的更多相关文章

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

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

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

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

  3. ISO/IEC 9899:2011 条款6.10.1——条件包含

    6.10.1 条件包含 约束 1.控制条件包含的表达式应该是一个整数常量表达式,除了:标识符(包括那些词法上与关键字相同的)被解析为以下所描述的:[注:因为控制常量表达式在翻译阶段4期间被计算,所以所 ...

  4. ISO/IEC 9899:2011 条款6——语言

    6 语言 6.1 标记法 1.在本条款中所使用的语法标记法.语义类别(非终结符)用斜体字指示,而字面量单词以及字符集成员(终结符)用粗体字指示.跟在一个非终结符后面的冒号(:)引出其定义.在单独的行中 ...

  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 条款5——5.2.4 环境限制

    5.2.4 环境限制 1.翻译与执行环境都约束了语言翻译器和库的实现.下面概述了对一个顺应标准实现的语言相关的环境限制:库相关的限制在条款7中讨论. 5.2.4.1 翻译限制 1.实现应该能够翻译并执 ...

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

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

随机推荐

  1. nodejs 删除空文件

    var fs = require("fs") var path = require("path") var listRealPath = path.resolv ...

  2. Locust性能模块浅谈

    今天接触到Locust性能模块,下面介绍一下安装与简单的应用 1.安装方式:pip install Locust Locust支持Python 2.7, 3.4, 3.5, and 3.6的版本,小编 ...

  3. InnoDB存储引擎与MyIsam存储引擎的区别

    特性比较 mysql5.5之后默认的存储引擎为InnoDB,在此之前默认存储引擎是MyIsam 特点 MyIsam InnoDB 锁机制 表锁 行锁 事务 不支持 支持 外键 不支持 支持 B树索引 ...

  4. 用PHP的fopen函数读写robots.txt文件

    以前介绍了用PHP读写文本文档制作最简单的访问计数器不需要数据库,仅仅用文本文档就可以实现网页访问计数功能.同样我们可以拓展一下这个思路,robots.txt文件对于我们网站来说非常重要,有时候我们需 ...

  5. Permission denied (publickey,gssapi-keyex,gssapi-with-mic).错误的解决

    SSH登录提示 Permission denied (publickey,gssapi-keyex,gssapi-with-mic). 修改被登录的SSH服务器ssh配置,/etc/ssh/sshd_ ...

  6. [Flutter] Style a message chat style-ish bubble

    const kOtherBubblePointer = BorderRadius.only( topRight: Radius.circular(30), bottomLeft: Radius.cir ...

  7. Java LinkedList add vs push

    Java LinkedList add 是加在list尾部. LinkedList push 施加在list头部. 等同于addFirst.

  8. 留言板(Nodejs)

    一.知识点 ①nodejs实际开发中,通常把所有的HTML文件放到views目录中 ②nodejs实际开发中,通常把所有的静态资源文件放到public目录中,方便统一处理 当浏览器收到HTML响应内容 ...

  9. linux命令之------Chown命令

    Chown命令 1) 作用:将指定文件的拥有者改为指定的用户或组. 2) -c:显示更改的部分的信息. 3)-f:忽略错误信息. 4)-h:修复符号链接. 5)-v:显示详细的处理信息. 6)-R:处 ...

  10. CH定理与线性递推

    才发觉自己数学差的要死,而且脑子有点浑浑噩噩的,学了一个晚上才学会 如果说的有什么不对的可以在下面嘲讽曲明 以下无特殊说明时,默认方阵定义在实数域上,用\(|A|\)表示\(A\)的行列式 特征值与特 ...