在 C++11 2.5 预处理标记 [lex.pptoken] 中:
As described in Clause 16, in certain circumstances during translation phase 4, white space (or the absence thereof) serves as more than preprocessing token separation.
这是指什么情况?
最佳答案
在第 4 阶段有几次空格很重要:
每个预处理指令都以
#
标记开头,“它是源文件中的第一个字符……或者跟在包含至少一个换行符的空格之后的字符。”每个预处理指令都以换行符结尾。在类似函数的宏定义中,参数列表开始的左括号必须紧跟在命名宏的标识符之后。它们之间不能有空格。
例如,指令
#define F()
定义了一个类似函数的宏,它扩展为空,而指令#define F ()
定义了一个对象-就像扩展为()
的宏。当
#
运算符在宏替换期间计算时,空格在字符串化期间被考虑在内。要字符串化的标记之间的空格序列在生成的字符串文字中折叠为单个空格。例如,字符序列
f(x)
被字符串化为"f(x)"
,但是字符序列f(x)
被字符串化为"f ( x )"
,即使在宏替换后两者之间没有语义差异。
请注意,转义换行符在阶段 2 中被消除,每个注释在阶段 3 中被替换为单个空格字符。这两者都发生在阶段 4 之前,因此在阶段 4 中转义换行符不算数作为换行符,注释与空格字符无法区分。
关于c++ - C++11 中的空白比预处理标记分离更多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14763892/