Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
预处理多行注释及其在文件末尾嵌入的换行符 这是关于C99/C11(也可能是C++)预处理器及其标准符合性问题。 让我们考虑两个源文件: /* I'm * multiline * comment */_C++_C_Comments_C Preprocessor_Language Lawyer - Fatal编程技术网

预处理多行注释及其在文件末尾嵌入的换行符 这是关于C99/C11(也可能是C++)预处理器及其标准符合性问题。 让我们考虑两个源文件: /* I'm * multiline * comment */

预处理多行注释及其在文件末尾嵌入的换行符 这是关于C99/C11(也可能是C++)预处理器及其标准符合性问题。 让我们考虑两个源文件: /* I'm * multiline * comment */,c++,c,comments,c-preprocessor,language-lawyer,C++,C,Comments,C Preprocessor,Language Lawyer,及 如果我们用gcc或clang(测试了几个版本)预处理这两个文件,就会有不同。在第一种情况下,预处理器不会保留多行注释中的换行符。在第二种情况下,所有换行符都将保留 所有提到的标准都说(在“翻译阶段”的某个地方): 每个注释都替换为一个空格字符。保留新行字符 为什么在文件末尾处理多行注释时会有差异?这种行为符合标准吗?原因很简单-行号和错误报告。由于编译器会报告行号错误,因此预处理文件中的行号与原始文件中的行号相对应是很方便的。这就是为什么注释占用的行在后面跟代码时会被保留,而不必在文件末尾保

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

所有提到的标准都说(在“翻译阶段”的某个地方):

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


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

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

至于标准。标准

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

ISO/IEC 9899:2011未规定

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

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

原因听起来不错,但它是标准允许的还是强制的?@osgx我同意@Tomas保留换行符的意图。尽管如此,保留它们似乎只是一种可能的实现技术(丢弃它们并发出一个
#行
也应该有效),因此我倾向于将这视为标准的问题-它应该指定效果(行号不变),而不是实现。当在大型应用程序中必须从a和B中进行选择时,老年人更喜欢修复影响分析。
影响分析
!!(你知道,即使是一个标准,也只有在实现时才存在)。
/* I'm 
 * multiline
 * comment
 */
i_am_a_token;