-E
输出不是由标准正式规定的。这是在几个不同的设计约束条件,其中符合的两个是工程折衷:
- 空白必须插入或使“编译适当的”(想象喂养
-E
输出回gcc -fpreprocessed
必要删除 - 这是-save-temps
所做的)看到它通常会(不含-E
)的相同序列pp-token。 (请参阅C99第6.4节以了解pp令牌的定义。)
- 尽可能使用令牌应该出现在他们在原始源代码中所做的相同行和列位置,以便错误消息和调试信息尽可能准确。
下面是如何适用于你的例子:
ret\
urn 0;
反斜杠换行结合ret
和urn
成一个单一的PP-令牌,因此它必须出现一起在输出一行。然而,0
和;
应继续保留在其原始行和列中,以便诊断准确无误。所以你得到
return
0;
插入空格,以保持0
在其原始列。
ret\
urn 0;
这里反斜杠换行后面紧跟着空白,所以ret
和urn
做不已被合并,因此,再次诊断是最准确的,如果一切保持它原来是和输出是
ret
urn 0;
看起来像反斜杠新行没有任何效果。
您可能会发现gcc -E -P
的输出不那么令人惊讶。 -P
告诉预处理器不要试图保留令牌位置(并关闭输出中以#
开头的所有行)。您的示例在-P
模式下生成return 0;
和ret urn 0;
,全都在一行上。最后,一个建议的话:每个人都必须阅读你的代码(并且包括六个月后你自己的代码),如果你从未使用将中间的标记拆分为反斜杠 - 换行符,除非是长字符串文字。这是一个遗留的错误,如果它是从头开始设计的,将不会包含在该语言中。
什么问题? –
重现问题的代码在哪里? –
不需要代码。我不在乎我正在谈论的预处理器阶段的代码执行! – Sabrina