Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中的空格+;11多个预处理令牌分离?_C++_C++11 - Fatal编程技术网

C++ C+中的空格+;11多个预处理令牌分离?

C++ C+中的空格+;11多个预处理令牌分离?,c++,c++11,C++,C++11,在C++11 2.5预处理令牌[lex.pptoken]中: 如第16条所述, 在翻译阶段4的某些情况下,空白(或不存在空白)不仅仅是预处理标记分离 这指的是什么情况?说明: 所有空白都是空白 除预处理过程中的某些情况外,其他情况相同(参见 #cpp.stringize中的字符串文字创建运算符,用于 示例) 你可以读到。以下是相关信息: 如果在替换列表中,参数前面紧跟着 #预处理令牌,两者都被单个字符串替换 文字预处理标记,包含相应参数的预处理标记序列的拼写。每个参数的预处理标记之间都出现空白

在C++11 2.5预处理令牌[lex.pptoken]中:

如第16条所述, 在翻译阶段4的某些情况下,空白(或不存在空白)不仅仅是预处理标记分离

这指的是什么情况?

说明:

所有空白都是空白 除预处理过程中的某些情况外,其他情况相同(参见 #cpp.stringize中的字符串文字创建运算符,用于 示例)

你可以读到。以下是相关信息:

如果在替换列表中,参数前面紧跟着
#
预处理令牌,两者都被单个字符串替换 文字预处理标记,包含相应参数的预处理标记序列的拼写。每个参数的预处理标记之间都出现空白 成为字符串文字中的单个空格字符。 第一个预处理标记之前和最后一个预处理标记之后的空白 包含参数的预处理标记被删除。否则,, 参数中每个预处理标记的原始拼写为 保留在字符串文字中,特殊处理除外 用于生成字符串文字和字符文字的拼写: 在字符的每个
\
字符之前插入一个
\
字符 文字或字符串文字(包括分隔符
字符)。如果 结果的替换不是有效的字符串文字, 该行为未定义。未指定
操作员的评估顺序


在第4阶段,有几种情况下,空格很重要:

  • 每个预处理指令都以一个
    #
    标记开始,该标记“要么是源文件中的第一个字符……要么紧跟在包含至少一个新行字符的空格之后。”每个预处理指令都以一个新行字符结束

  • 在类似宏定义的函数中,参数列表开头的左括号必须紧跟在命名宏的标识符之后。它们之间不能有空格

    例如,指令
    #define F()
    定义了一个类似于宏的函数,它可以扩展为零,而指令
    #define F()
    定义了一个类似于宏的对象,它可以扩展为
    ()

  • 当在宏替换过程中计算
    #
    运算符时,字符串化过程中会考虑空格。要进行字符串化的标记之间的空格序列被折叠到结果字符串文本中的单个空格中

    例如,字符序列
    f(x)
    被字符串化为
    “f(x)”
    ,但字符序列
    f(x)
    被字符串化为
    “f(x)”
    ,即使在宏替换后这两个字符之间没有语义差异


请注意,转义的新行字符在第2阶段被删除,每个注释在第3阶段被单个空格字符替换。这两个阶段都发生在第4阶段之前,因此,在第4阶段,转义的新行不算作新行,注释与空格字符无法区分。

Imho在这个问题中加入
第16条
是明智的。Relevant@us2012:Clause 16是关于预处理指令的整个部分,有12页长。通常,空格包括空格、制表符、,然而,在预处理器中,在预处理阶段之后(当源只是一个令牌序列时),换行符仍然具有它们没有的意义。