在C++ 11 2.5预处理令牌[lex.pptoken]:
如条款16所述,在翻译阶段4期间的某些情况下,空白空间(或其不存在)不仅仅用于预处理标记分离.
这指的是哪种情况?
在第4阶段有几种情况,其中空白是重要的:
每个预处理指令都以一个#标记开头,该标记"是源文件中的第一个字符......或者是包含至少一个换行符的空格." 每个预处理指令以换行符结尾.
在类似函数的宏定义中,以参数列表开头的左括号必须紧跟在命名宏的标识符之后.它们之间一定不能有空格.
例如,该指令#define F()定义了一个类似函数的宏,它扩展为空,而该指令#define F ()定义了一个扩展为的类似对象的宏().
#在宏替换期间评估运算符时,在字符串化期间考虑空白.要进行字符串化的标记之间的空格序列将折叠到生成的字符串文字中的单个空格中.
例如,字符序列f(x)被字符串化为"f(x)",但字符序列f ( x )被字符串化为"f ( x )",即使宏替换后这两者之间没有语义差异.
请注意,在阶段2中消除了转义的换行符,并且在阶段3中将每个注释替换为单个空格字符.这两个字符都发生在阶段4之前,因此在阶段4期间,转义的换行符不算新的-line和注释与空格字符无法区分.
| 归档时间: |
|
| 查看次数: |
421 次 |
| 最近记录: |