多行注释和换行

时间:2013-03-16 04:31:12

标签: c++ c++11 c-preprocessor

在C ++ 11中,标准在2.2.3中说:

  

每个评论都被一个空格字符替换。保留换行符。

  1. 该短语是否是连续的,意味着保留用于以新行终止的评论的新行?

  2. 如果(1)为真,那么为什么Visual C ++,gcc和clang会为多注释中的每一行保留空行。

  3. 这个问题很重要,因为我正在编写一个c ++预处理器。

2 个答案:

答案 0 :(得分:2)

它所讨论的新行是在用单个空格字符替换注释后仍然存在的行。当在包含在其中的段落的较大上下文中查看片段时,这一点更加清晰。

具体而言,多行注释中的新行保留,并且不会终止预处理指令。

答案 1 :(得分:2)

C / C ++预处理器会删除所有注释,但在查看预处理器输出时,通常会将源行保持在相同的行号。

这样,读取预处理器输出的编译器可以为错误消息和警告打印正确的行号。

预处理器通常也会保留所有空行。

您还必须严格区分从源中删除的多行宏以及何时展开它们。它们总是被移除,同时保留所有换行符。它们总是被剥离的所有换行符替换。两者都是完全独立的操作,彼此无关。

在过去,C预处理器将始终在stdout上生成其输出,C编译器将从stdin读取它。预处理器发出内部#<N> "<FILE>"语句,C编译器将其解释为“行号N跟随”。因此预处理器理论上可以不在输出中发出空行。但实际上,此#<N> "<FILE>"功能仅用于#include语句之后的行。

今天预处理器内置于C编译器中以提高性能,但如果明确请求,您仍然可以查看中间结果。

注意:另请参阅下面的好注释:标准并未真正指定预处理器的文本输出在空格方面的外观。文本输出是特定于实现的。有很大的解释空间。定义的是至少有一个空格字符,并且所有tokes都保留在原始行上(或者用其原始行标记),以便错误消息有意义。