2013-03-16 52 views
4

在C++ 11,标准说,在2.2.3:多行注释和新线

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

  1. 是这句话的顺序,这意味着留住新线征求意见,与新行终止?

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

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

+0

顺便说一下,这对于宏声明是特别有意义的,因为它们以(非拼接)“新行”字符结束。 – 2013-03-16 05:14:56

+0

@ K-ballo:即使多行注释在#define之后开始,并在10行之后结束,然后是宏名称及其定义,它仍然可以工作并且宏将有效 – 2013-03-16 05:45:31

+0

相关:http://forum.cppgm.org/question/667/new-line-characters-in-c-comments – 2013-03-16 06:46:20

回答

2

它所谈论的新行是在评论被单个空格字符替换后仍然存在的新行。当在包含的段落的较大上下文中查看片段时,这是更清楚的。

因此,特别是多行注释中的新行是而不是保留,并且不会终止预处理指令。

+0

如果那真的那么你对问题2的回答是什么? – 2013-03-16 06:15:20

+0

@Muhammadalaa:他们没有保留标准意义上的意思。发生的事情是,为了很好地打印预处理程序的输出,而不是将所有非新行空白与单个空格一样存储,它们将其中的一部分保留在其“空白标记”中。然而,从逻辑上讲,这对预处理器的功能没有影响,只是为了让'gcc -E'的中间输出更具人类可读性。 – 2013-03-16 06:21:11

2

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

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

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

您还必须严格区分从源代码中删除的多行宏以及何时扩展。他们总是被删除,同时保持所有换行。它们总是被取代,所有的换行都被剥离。两者完全独立,彼此无关。

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

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

注意:另请参见下面的好评:该标准并未真正指定预处理程序的文本输出在空白方面的外观。文本输出是特定于实现的。有很多解释的余地​​。定义的内容是至少有一个空格字符必须在哪里,并且所有的标记都保留在原始行上(或用原始行标记),以便错误消息有意义。

+1

好帖子,但区分标准指定的内容和特定于实现的内容很重要。阶段4的标准逻辑输出是一系列没有明显空白的“预处理 - 标记”。您所描述的“文本”输出格式(例如'gcc -E')不是标准要求或规定的。符合标准的预处理器不需要生成这种格式,即使它具有这种格式,也不足以在预处理器之间进行差异等价处理。在成功理解第16条之前,需要理解这一点。 – 2013-03-25 19:48:34