注释是不是允许与预处理器指令在同一行,在这种情况下它们的含义是啥?
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 已经变成了空白,这通常对预处理指令的行为没有影响。
【讨论】:
以上是关于注释是不是允许与预处理器指令在同一行,在这种情况下它们的含义是啥?的主要内容,如果未能解决你的问题,请参考以下文章