为什么c预处理器指令在#?之后直接跟随它时会忽略\ newline规则?

时间:2015-10-02 16:19:53

标签: c-preprocessor

通常,通过标准,直接跟在换行符之后的任何\都将转换为没有换行符和反斜杠的代码。例如:

int yams\
yams;

变成

int yamsyams;

int cheese // blerg \
more blerg

变成

int cheese // blerg more blerg

对于很长的单行代码,这种行为很不错。

然而,似乎

#\
This code not part of the macro

虽然

#a\
This code is part of the macro.

甚至

#        \
This code is not part of the macro

虽然

#    a\
This code is part of the macro

为什么这是“\ newline”被删除规则的一个例外?

1 个答案:

答案 0 :(得分:2)

[lex.phases]中所述,替换反斜杠换行符是由预处理器完成的,并且应该在第2阶段很早就发生,这是在将源拆分为预处理器令牌(阶段3)之前和处理预处理器之前指令,例如#define#include(第4阶段)。

因此,在所有示例中,您都应该看到反斜杠换行符。