在文件末尾预处理多行注释及其嵌入的换行符

时间:2014-01-08 18:04:24

标签: c++ c comments c-preprocessor language-lawyer

这是关于C99 / C11(也可能是C ++)预处理器及其标准合规性的问题。

让我们考虑两个源文件:

/* I'm 
 * multiline
 * comment
 */

/* I'm 
 * multiline
 * comment
 */
i_am_a_token;

如果我们用gcc或clang预处理这两个文件(测试了几个版本),那将会有所不同。在第一种情况下,预处理器不会保留多行注释的换行符。在第二种情况下,所有换行都将被保留。

所有提到的标准都说(在“翻译阶段”内部):

  

每个评论都被一个空格字符替换。保留换行符。

为什么在文件末尾处理多行注释存在差异?这种行为符合标准吗?

1 个答案:

答案 0 :(得分:6)

原因很简单 - 行号和错误报告。由于编译器使用行号报告错误,因此方便预处理文件中的行号对应于原始文件中的行号。这就是注释所占用的行在代码后面被保留的原因,而它们不必在文件末尾保留。

至于标准。标准

指定语言,预处理宏等,但是指定 应该如何处理语言。您可以在C11的范围定义中看到它:

  

ISO / IEC 9899:2011未指定

     
      
  • 转换C程序以供数据处理系统使用的机制;
  •   

这意味着预处理器输出几乎是内部问题,超出了标准的范围。