为什么这个取消注释的宏在clang中无效,但在msvc中有效

时间:2017-01-06 15:05:23

标签: c++ c-preprocessor

为什么这个取消注释的宏在clang中无效,但在msvc中有效:

http://coliru.stacked-crooked.com/a/8fd2a3ccd933618f
http://rextester.com/GFNL42397

#define COMMENT / ## /

int main() 
{

    COMMENT int a = 0;
}

2 个答案:

答案 0 :(得分:3)

如果你看一下,例如this translation phase reference您将看到注释被第3阶段中的最后一个空格替换,这是运行预处理器之前的阶段。因此,您显示的代码无效。 Clang是对的。

答案 1 :(得分:1)

因为MSVC重新评估预处理器输出而clang没有:

  • clang将结果//视为无效令牌并且是正确的。 (@Some程序员dude提到的第3阶段在这里没有效果,因为预处理器还没有运行,它将在第4阶段运行,所以没有注释行被单个空格替换)
  • MSVC重新扫描预处理的输入,并用单个空格替换注释行。因此,MSVC不会抱怨。

    另见Preprocessor – The Token Pasting (##) Operator