预处理多行注释及其在文件末尾嵌入的换行符 这是关于C99/C11(也可能是C++)预处理器及其标准符合性问题。 让我们考虑两个源文件: /* I'm * multiline * comment */
及 如果我们用gcc或clang(测试了几个版本)预处理这两个文件,就会有不同。在第一种情况下,预处理器不会保留多行注释中的换行符。在第二种情况下,所有换行符都将保留 所有提到的标准都说(在“翻译阶段”的某个地方): 每个注释都替换为一个空格字符。保留新行字符预处理多行注释及其在文件末尾嵌入的换行符 这是关于C99/C11(也可能是C++)预处理器及其标准符合性问题。 让我们考虑两个源文件: /* I'm * multiline * comment */,c++,c,comments,c-preprocessor,language-lawyer,C++,C,Comments,C Preprocessor,Language Lawyer,及 如果我们用gcc或clang(测试了几个版本)预处理这两个文件,就会有不同。在第一种情况下,预处理器不会保留多行注释中的换行符。在第二种情况下,所有换行符都将保留 所有提到的标准都说(在“翻译阶段”的某个地方): 每个注释都替换为一个空格字符。保留新行字符 为什么在文件末尾处理多行注释时会有差异?这种行为符合标准吗?原因很简单-行号和错误报告。由于编译器会报告行号错误,因此预处理文件中的行号与原始文件中的行号相对应是很方便的。这就是为什么注释占用的行在后面跟代码时会被保留,而不必在文件末尾保
为什么在文件末尾处理多行注释时会有差异?这种行为符合标准吗?原因很简单-行号和错误报告。由于编译器会报告行号错误,因此预处理文件中的行号与原始文件中的行号相对应是很方便的。这就是为什么注释占用的行在后面跟代码时会被保留,而不必在文件末尾保留 至于标准。标准
- C99:
- C11:
- 转换C程序以供数据处理系统使用的机制李>
这意味着预处理器输出几乎是内部问题,超出了标准的范围。原因听起来不错,但它是标准允许的还是强制的?@osgx我同意@Tomas保留换行符的意图。尽管如此,保留它们似乎只是一种可能的实现技术(丢弃它们并发出一个
#行
也应该有效),因此我倾向于将这视为标准的问题-它应该指定效果(行号不变),而不是实现。当在大型应用程序中必须从a和B中进行选择时,老年人更喜欢修复影响分析。影响分析
!!(你知道,即使是一个标准,也只有在实现时才存在)。
/* I'm
* multiline
* comment
*/
i_am_a_token;