多行注释和新行

Multi-line comments and new-lines

本文关键字:新行 多行注释      更新时间:2023-10-16

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

每个注释用一个空格字符替换。保留换行符

  1. 这个短语是顺序的吗,意思是保留以new-line结束的注释的new-line?

  2. 如果(1)为真,那么为什么Visual c++, gcc和clang在多注释中每行保持空行

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

它所讨论的新行是在注释被单个空格字符替换之后仍然存在的行。当将该片段放在包含它的段落的更大的上下文中查看时,这一点就更清楚了。

所以多行注释中的新行是而不是,并且不终止预处理指令。

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

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

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

您还必须严格区分从源文件中删除多行宏和扩展多行宏的情况。它们总是被删除而保留所有换行符。它们总是被替换,所有换行符都去掉。两者都是完全独立的操作,彼此之间没有任何关系。

在过去,C预处理器总是在标准输出(stdout)上生成输出,C编译器从标准输出(stdin)中读取输出。预处理器发出内部#<N> "<FILE>"语句,C编译器将其解释为"行号N紧随其后"。因此,理论上,预处理器可以在输出中不发出空行。但是在实践中,这个#<N> "<FILE>"特性只用于#include语句后面的行。

现在,预处理器被内置到C编译器中以提高性能,但是如果显式请求,您仍然可以查看中间结果。

注意:请参阅下面的注释:标准并没有真正指定预处理器的文本输出在空白方面是什么样子的。文本输出是具体实现的。有相当大的解释空间。定义的是至少一个空格字符必须在哪里,并且所有的符号都必须留在它们原来的行上(或者用它们原来的行标记),以便错误消息有意义。