这是关于C99 / C11(也可能是C ++)预处理器及其标准合规性的问题。
让我们考虑两个源文件:
/* I'm
* multiline
* comment
*/
和
/* I'm
* multiline
* comment
*/
i_am_a_token;
如果我们用gcc或clang预处理这两个文件(测试了几个版本),那将会有所不同。在第一种情况下,预处理器不会保留多行注释的换行符。在第二种情况下,所有换行都将被保留。
所有提到的标准都说(在“翻译阶段”内部):
每个评论都被一个空格字符替换。保留换行符。
为什么在文件末尾处理多行注释存在差异?这种行为符合标准吗?
答案 0 :(得分:6)
原因很简单 - 行号和错误报告。由于编译器使用行号报告错误,因此方便预处理文件中的行号对应于原始文件中的行号。这就是注释所占用的行在代码后面被保留的原因,而它们不必在文件末尾保留。
至于标准。标准
指定语言,预处理宏等,但是不指定 应该如何处理语言。您可以在C11的范围定义中看到它:
ISO / IEC 9899:2011未指定
- 转换C程序以供数据处理系统使用的机制;
这意味着预处理器输出几乎是内部问题,超出了标准的范围。