为什么这个取消注释的宏在 clang 中无效,但在 msvc 中有效
Why is this uncommenting macro invalid in clang but valid in msvc
为什么这个取消注释的宏在 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不会抱怨。
另请参阅预处理器 – 令牌粘贴 (##) 运算符
相关文章:
- 代码在main()中运行,但在函数中出现错误
- 链接阶段在Ubuntu上失败,但在MacOS上失败
- 类外的前向声明有效,但在嵌套时无效
- 将流定义为私有类变量似乎在Linux下有效,但在WindowsVisualStudio下无效
- 在C++中嵌入Python:在Python脚本中导入模块在一个函数调用过程中有效,但在另一个调用过程中无效
- 为什么这个取消注释的宏在 clang 中无效,但在 msvc 中有效
- Tensorflow模型在Python中有效,但在C++中无效
- 为什么从字符串常量到"char*"的转换在 C 中有效,但在C++中无效
- NEON内在类型在C中工作,但在C++中抛出无效参数错误
- C++代码在我的机器上有效,但在我的学校服务器上无效(cin.getline())
- RegisterClassEx在64位上的参数无效(但在32位上工作)
- 代码在CLR项目中有效,但在Win32中无效
- 在 clang 中显式指定的参数无效,但在 gcc 中成功编译 — 谁错了?
- 重复的类型定义-在C中无效,但在c++中有效
- 无效的正则表达式在Qt但在正则表达式教练这个相同的正则表达式是有效的
- 函数指针赋值在C中有效,但在C++中无效
- std::stringstream推理在Visual Studio 2013上有效,但在Linux下无效
- 删除数组在CodeBlocks上有效,但在Visual上无效
- 将opengl窗口转换为std::size_t并再次返回在Linux中有效,但在OS X中无效
- SDL 控制台输出在调试时有效,但在与 exe 一起运行时无效