为什么这个取消注释的宏在 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不会抱怨。
另请参阅预处理器 – 令牌粘贴 (##) 运算符