注释是否与预处理程序指令在同一行上允许,在这种情况下它们的含义是什么?

时间:2015-11-06 19:43:23

标签: c++ comments preprocessor-directive

我正在考虑这样的事情:

#include <iostream> // Comment

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

  

预处理指令控制预处理器的行为。每个指令占用一行并具有以下格式:

     

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

很好,给出了整条生产线的完整规范,并且那里没有评论的地方。在这些方面不允许提出意见。

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

我更加困惑的是,有人告诉我&#34; 在#行中发表评论仍然有效,但它们可能并不意味着你想要什么& #34 ;.我不确定这是怎么回事,因为根据http://en.cppreference.com/w/cpp/language/translation_phases注释在启动预处理器之前被空格字符替换 - 所以如果它们被允许在#行上,它们怎么会干扰语义这样的#行?

1 个答案:

答案 0 :(得分:11)

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

因此,当预处理器处理#行时,注释已转换为空格,这通常不会影响预处理指令的行为。