代码之家  ›  专栏  ›  技术社区  ›  Muhammad

多行注释和新行

  •  4
  • Muhammad  · 技术社区  · 12 年前

    在C++11中,标准如2.2.3所述:

    每个注释都替换为一个空格字符。保留新行字符。

    1. 这个短语是连续的吗?意思是为以新行结束的注释保留新行?

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

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

    2 回复  |  直到 9 年前
        1
  •  2
  •   Andrew Tomazos    12 年前

    它所说的新行是在注释被一个空格字符取代后仍然存在的。当在包含该片段的段落的较大上下文中查看该片段时,这一点会更清楚。

    具体来说,多行注释中的新行是 保留并且不终止预处理指令。

        2
  •  2
  •   Johannes Overmann    12 年前

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

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

    预处理器通常也保持所有空行的原样。

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

    在过去,C预处理器总是在stdout上产生输出,而C编译器则从stdin中读取输出。预处理器发出内部 #<N> "<FILE>" C编译器将其解释为“行号N在后面”的语句。因此,理论上,预处理器可以在输出中不发出空行。但在实践中 #<N>“<文件>” 功能仅用于以下行 #include 声明。

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

    注意:另请参阅下面的好评论:该标准并没有真正指定预处理器的文本输出在空白方面的样子。文本输出是特定于实现的。还有相当大的解释空间。定义的是至少有一个空格字符必须在哪里,并且所有标记都停留在其原始行上(或用其原始行标记),这样错误消息才有意义。