注释是不是允许与预处理器指令在同一行,在这种情况下它们的含义是啥?

Posted

技术标签:

【中文标题】注释是不是允许与预处理器指令在同一行,在这种情况下它们的含义是啥?【英文标题】:Are comments allowed on the same line as preprocessor directives and what is their meaning in such case?注释是否允许与预处理器指令在同一行,在这种情况下它们的含义是什么? 【发布时间】:2016-02-08 01:17:21 【问题描述】:

我正在考虑这样的事情:

#include <iostream> // Comment

嗯,cppreference.com (http://en.cppreference.com/w/cpp/preprocessor) 声称:

预处理指令控制预处理器的行为。每个指令占一行,格式如下:

# 字符 预处理指令(define、undef、include、if、ifdef、ifndef、else、elif、endif、line、error、pragma 之一) 参数(取决于指令) 换行

好了,整行的完整规范都给出了,这里没有评论的地方。在这些行中不允许使用建议的 cmets。

但是,即使使用 -Wall -Wextra -Wpedantic,g++ 和 clang++ 都接受这样的输入。 cplusplus.com 还提供了此类 cmets 的示例:http://www.cplusplus.com/reference/istream/istream/operator%3E%3E/

我更加困惑的是,有人告诉我“将 cmets 放在 # 行中仍然有效,但它们可能不是你想要的意思”。我不确定这是怎么回事,因为根据http://en.cppreference.com/w/cpp/language/translation_phases cmets 在预处理器启动之前被空格字符替换 - 所以如果它们在 # 行上被允许,它们怎么会干扰这样的语义 #行吗?

【问题讨论】:

【参考方案1】:

如您链接到的翻译阶段文档中所述:在阶段 3 的步骤 3 中,注释被替换为空格。预处理器在阶段 4 中执行。

所以当预处理器处理# 行时,cmets 已经变成了空白,这通常对预处理指令的行为没有影响。

【讨论】:

以上是关于注释是不是允许与预处理器指令在同一行,在这种情况下它们的含义是啥?的主要内容,如果未能解决你的问题,请参考以下文章

bash下特殊字符的含义

批处理

为啥 C 预处理器不忽略它跳过的块中的无效指令?

如何在同一行获得两个日期选择器?

如何在不改变位置的情况下调整同一行中的两个 React 日期选择器

在不使用 div 宽度的情况下将图像和一些文本对齐在同一行?