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

Why is this uncommenting macro invalid in clang but valid in msvc

本文关键字:无效 但在 有效 msvc clang 取消 注释 为什么      更新时间:2023-10-16

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


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

#define COMMENT / ## /
int main() 
{
    COMMENT int a = 0;
}

例如,如果您查看此转换阶段参考,您将看到注释被阶段 3 中的最后一个空格替换,这是运行预处理器之前的阶段。因此,您显示的代码无效。叮当是对的。

因为 MSVC 会重新计算预处理器输出,而 clang 不会:

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

    另请参阅预处理器 – 令牌粘贴 (##) 运算符