在C ++ 11中,标准在2.2.3中说:
每个评论都被一个空格字符替换。保留换行符。
该短语是否是连续的,意味着保留用于以新行终止的评论的新行?
如果(1)为真,那么为什么Visual C ++,gcc和clang会为多注释中的每一行保留空行。
这个问题很重要,因为我正在编写一个c ++预处理器。
答案 0 :(得分:2)
它所讨论的新行是在用单个空格字符替换注释后仍然存在的行。当在包含在其中的段落的较大上下文中查看片段时,这一点更加清晰。
具体而言,多行注释中的新行不保留,并且不会终止预处理指令。
答案 1 :(得分:2)
C / C ++预处理器会删除所有注释,但在查看预处理器输出时,通常会将源行保持在相同的行号。
这样,读取预处理器输出的编译器可以为错误消息和警告打印正确的行号。
预处理器通常也会保留所有空行。
您还必须严格区分从源中删除的多行宏以及何时展开它们。它们总是被移除,同时保留所有换行符。它们总是被剥离的所有换行符替换。两者都是完全独立的操作,彼此无关。
在过去,C预处理器将始终在stdout上生成其输出,C编译器将从stdin读取它。预处理器发出内部#<N> "<FILE>"
语句,C编译器将其解释为“行号N跟随”。因此预处理器理论上可以不在输出中发出空行。但实际上,此#<N> "<FILE>"
功能仅用于#include
语句之后的行。
今天预处理器内置于C编译器中以提高性能,但如果明确请求,您仍然可以查看中间结果。
注意:另请参阅下面的好注释:标准并未真正指定预处理器的文本输出在空格方面的外观。文本输出是特定于实现的。有很大的解释空间。定义的是至少有一个空格字符,并且所有tokes都保留在原始行上(或者用其原始行标记),以便错误消息有意义。