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. SWD烧录/仿真方式

    单片机在烧写/仿真的时候具有一种方式叫做SWD,这种方式只用到两根线SWDIO,SWCLK.一般SWD和JTAG中的JTMS和JTCK共用的.由于线少,所以使用非常方便,但是速率相对较低. 在接线时, ...

  2. MySQL/MariaDB数据库的视图(VIEW)

     MySQL/MariaDB数据库的视图(VIEW) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.视图概述 1>.什么是视图 视图就是一个虚拟的表,保存有实表的查询结果 ...

  3. Linux标准IO和管道

    Linux标准IO和管道 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.标准输入和输出 程序:指令+数据 读入数据:Input 输出数据:Output 打开的文件都有一个fd: ...

  4. 查找正在运行的nginx目录

    linux系统因为备份.不同版本等问题,导致ECS Linux上存放有多个Nginx目录,可以通过如下方法定位当前正在运行的Nginx的配置文件: 1. 查看nginx的PID,以常用的80端口为例: ...

  5. Celery(异步任务,定时任务,周期任务)

    1.什么是Celery Celery是基于Python实现的模块,用于异步.定时.周期任务的. 组成结构: 1.用户任务 app 2.管道broker 用于存储任务 官方推荐 redis/rabbit ...

  6. c++查询特定字符串位置

    size_t find (const string& str, size_t pos = 0) const noexcept;(摘自c++官网:std::string::find) size_ ...

  7. springboot+Mybatis+MySql 一个update标签中执行多条update sql语句

    Mysql是不支持这种骚操作的,但是不代表并不能实现,只需要在jdbc配置文件中稍微做一下修改就行. driver=com.mysql.jdbc.Driver url=jdbc:mysql://127 ...

  8. 11.vue-router编程式导航

    页面导航的两种方式 声明式导航:通过点击链接实现导航的方式,叫做声明式导航 例如:普通网页中的链接或vue中的 编程式导航:通过调用JavaScrip形式的API实现导航的方式,叫做编程式导航 例如: ...

  9. IntelliJ IDEA 2019.2破解

    IntelliJ IDEA 2019.2破解 我是参考这个激活的,使用的激活码的方式,需要在百度云盘下载压缩包 https://zhile.io/2018/08/25/jetbrains-licens ...

  10. cyyz: Day 6 平衡树整理

    一.平衡树 知识点: ,并且左右两个子树都是一棵平衡二叉树.平衡二叉树的常用实现方法有红黑树.AVL.替罪羊树.Treap.伸展树等. 最小二叉平衡树的节点的公式如下 F(n)=F(n-1)+F(n- ...