ISO/IEC 9899:2011 条款6.10——预处理指示符

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中的#字符串字面量创建操作符)。]一个换行字符终结预处理指示符,即使它在一个类似函数的宏的调用内发生。

时间: 2024-10-10 03:10:05

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

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

6.10.3 宏替换 约束 1.两个替换列表是相同的,当且仅当两个替换列表中的预处理符记都具有相同的数.次序.拼写,以及空白分隔符,这里所有的空白分隔符都认为是相同的. 2.当前被定义为一个类似对象的宏的标识符不应该被另一个#define预处理指示符重新定义,除非第二个定义是一个类似对象的宏定义,并且两个替换列表完全相同.类似的,当前被定义为类似函数的宏的标识符不应该用另一个#define预处理指示符重新定义,除非第二个定义是一个类似函数的宏定义,且具有相同个数的形参和拼写,以及两个替换列表完全

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

6.10.1 条件包含 约束 1.控制条件包含的表达式应该是一个整数常量表达式,除了:标识符(包括那些词法上与关键字相同的)被解析为以下所描述的:[注:因为控制常量表达式在翻译阶段4期间被计算,所以所有标识符要么是宏名,要么不是宏名——它们不会是关键字.枚举常量等等.]并且它可以包含单目操作符表达式形式 defined    identifier 或 defined    (    identifier    ) 上述形式将被计算为1,如果标识符当前被定义为一个宏名(即,如果它已被预定义,或者如

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

6.10.2 源文件包含 约束 1.一个#include指示符应该指定一个能被实现处理的头文件或源文件. 语义 2.一个预处理指示符如下形式 #    include    <h-char-sequence>    new-line 搜索一个由实现定义的地方的序列,该地方用<和>分隔符之间所指定的序列唯一标识,并使得该指示符用头文件整个内容进行替换.这些地方如何指定或头文件标识符如何指定是由实现定义的. 3.一个预处理指示符的如下形式 #    include    "q

ISO/IEC 9899:2011 条款6.4.3——通用字符名

6.4.3 通用字符名 语法 1.通用字符名: universal_character-name: \u hex-quad(四位十六进制数) \U hex-quad hex-quad hex-quad: hexadecimal-digit    hexadecimal-digit    hexadecimal-digit    hexadecimal-digit 约束 2.一个通用字符名不应该指定一个字符,其短标识符比00A0要小,除了0024($),0040(@),0060(`)之外,也不应该

ISO/IEC 9899:2011 条款4——顺应

4. 顺应 1.在本国际标准中,“应该”被解释为对一个实现或一个程序的要求:相反地,“不该”被解释为禁用. 2.如果违反了出现在一个强制规定或运行时强制规定之外的“应该”或“不该”要求,那么该行为是未定义的.否则,未定义行为在本国际标准中通过“未定义行为”这一短语或通过对任一显式定义的行为的缺省进行指定.在这三种表达方式之中没有特别的重点强调:它们都描述了“未定义的行为”. 3.在所有其它方面都正确的一个程序且操作正确的数据,却含有未指定的行为,那么应该是一个正确的程序并且其行为符号5.1.2.

ISO/IEC 9899:2011 条款6.4.8——预处理数字

6.4.8 预处理数字 语法 1.pp-number: digit .    digit pp-number    digit pp-number    identifier-nondigit pp-number    e    sign pp-number    E    sign pp-number    p    sign pp-number    P    sign pp-number    . 描述 2.一个预处理数字可以以一个数开头,前面可选地可加一个点(.),并且后面可以跟着有效的

ISO/IEC 9899:2011 条款6.5.1——基本表达式

6.5.1 基本表达式 语法 1.primary-expression: identifier constant string-literal (    expression    ) generic-selection 语义 2.一个标识符是一个基本表达式,提供为,它作为指派一个对象(在这种情况下,它是一个左值)或一个函数(在这种情况下,它是一个函数指派符)而被声明.[注:从而,一个未声明的标识符是对此语法的违反.][译者注:比如: int a = 10; a; // 这是一个基本表达式 ]

ISO/IEC 9899:2011 条款5——5.2.4 环境限制

5.2.4 环境限制 1.翻译与执行环境都约束了语言翻译器和库的实现.下面概述了对一个顺应标准实现的语言相关的环境限制:库相关的限制在条款7中讨论. 5.2.4.1 翻译限制 1.实现应该能够翻译并执行至少一个程序,该程序包含以下每个限制的至少一个实例:[注:实现应该尽量避免强加使用固定的翻译限制.] —— 127个语句块的嵌套层级 —— 63个带条件的包含嵌套层级 —— 12个指针.数组与函数声明符(以任意结合)在一个声明中用于修饰一个算术.结构体.联合体或void类型. —— 63个圆括号包

ISO/IEC 9899:2011 条款6.2.3——标识符的名字空间

6.2.3 标识符的名字空间 1.如果一个特定标识符的多个声明在一个翻译单元的任意一点可见,那么语法上下文会区分对不同实体的引用.从而,对于标识符各种不同的类别具有独立的名字空间: ——标签名(通过标签声明和使用的语法进行区分): ——结构体.联合体以及枚举的类型名(通过关键字struct.union或enum进行区分): ——结构体或联合体的成员:每个结构体或联合体为其成员具有一个独立的名字空间(通过用于访问成员的.或是->操作符的表达式类型进行区分): ——所有其它标识符称为普通标识符(声明