【问题标题】:Preprocessing multiline comments and their embedded newlines at the end of file在文件末尾预处理多行注释及其嵌入的换行符
【发布时间】:2014-01-27 00:00:04
【问题描述】:

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

让我们考虑两个源文件:

/* I'm 
 * multiline
 * comment
 */

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

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

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

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

为什么在文件末尾处理多行 cmets 会有所不同?这种行为是否符合标准?

【问题讨论】:

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


    【解决方案1】:

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

    至于标准。标准

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

    ISO/IEC 9899:2011 未指定

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

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

    【讨论】:

    • 理由听起来不错,但标准是否允许或强制?
    • @osgx 我同意@Tomas 关于保留换行符的意图。尽管如此,保留它们似乎只是一种可能的实现技术(丢弃它们并发出#line 也应该有效),所以我倾向于将此视为标准的问题——它应该指定效果(行号不变),而不是实现。
    • 在大型应用中必须选择A和B时,前辈更喜欢修复A。Impact Analysis!! (您知道,即使是标准,也只有在实施时才会出现)。
    猜你喜欢
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-28
    • 2021-07-21
    • 1970-01-01
    • 2013-03-16
    相关资源
    最近更新 更多