预处理器语法摘要 (C/C++)

本文介绍 C 和 C++ 预处理器的正式语法。 其中包含预处理指令和运算符的语法。 有关详细信息,请参阅预处理器Pragma 指令以及 __pragma_Pragma 关键字

语法摘要的定义

终止符是语法定义中的终结点。 不提供其他解决方法。 终止符包括保留字和用户定义的标识符的集。

非终止符是语法中的占位符。 它们中的大多数是在此语法摘要中的其他位置定义的。 定义可是递归的。 《C++ 语言参考》的词法约定部分定义了以下非终止符

constant、、constant-expressionidentifierkeywordoperatorpunctuator

可选组件由带下标的 opt 指示。 例如,以下语法指示包含在大括号中的可选表达式:

{optexpression }

文档约定

约定将对不同的语法组件使用不同的字体特性。 符号和字体如下所示:

特性 说明
nonterminal 斜体类型指示非终止符。
#include 粗体类型的终止符是必须按所示方式输入的文本保留字和符号。 此上下文中的字符始终区分大小写。
opt 后跟 opt 的非终止符始终是可选的。
default typeface 用此字样描述或列出的集中的字符可在语句中用作终止符。

跟在非终止符之后的冒号 (:) 引入其定义。 替代定义在单独的行上列出。

在代码语法块中,默认字样中的以下符号具有特殊含义:

符号 说明
[ ] 方括号括起的是可选元素。
{ | } 大括号括起的是替代元素,由竖线分隔。
... 指示可以重复上一个元素模式。

在代码语法块中,逗号 (,)、句点 (.)、分号 (;)、冒号 (:)、括号 (( ))、双引号 (") 和单引号 (') 是文本。

预处理器语法

control-line:
#define identifier token-stringopt
#defineidentifier ( identifieropt , ... , identifieropt opt ) token-string
#include "path-spec"
#include <path-spec>
#line digit-sequence "filename"opt
#undef identifier
#error token-string
#pragma token-string

constant-expression:
defined( identifier )
defined identifier
 任何其他常数表达式

conditional:
if-part elif-partsopt else-partopt endif-line

if-part:
if-line text

if-line:
#if constant-expression
#ifdef identifier
#ifndef identifier

elif-parts:
elif-line text
elif-parts elif-line text

elif-line:
#elif constant-expression

else-part:
else-line text

else-line:
#else

endif-line:
#endif

digit-sequence:
digit
digit-sequence digit

digit:以下项之一
0 1 2 3 4 5 6 7 8 9

token-string:
token 的字符串

token:
keyword
identifier
constant
operator
punctuator

filename:
 合法操作系统文件名

path-spec:
 合法文件路径

text:
 文本的任何序列

注意

《C++ 语言参考》的词法约定部分扩展了以下非终止符:constantconstant-expressionidentifierkeywordoperatorpunctuator

另请参阅

C/C++ 预处理器参考