sta*_*ole 42 c++ rawstring c-preprocessor c++11
此代码适用于Visual C++ 2013,但不适用于gcc/clang:
#if 0
R"foo(
#else
int dostuff () { return 23; }
// )foo";
#endif
dostuff();
Run Code Online (Sandbox Code Playgroud)
Visual C++首先删除if 0.Clang首先扩展R原始字符串(并且永远不会定义dostuff).谁是对的,为什么?
Ton*_*roy 36
[更新:Adrian McCarthy在下面评论说MSVC++ 2017修复此问题]
GCC和clang是对的,VC++是错误的.
2.2翻译阶段[lex.phases]:
[...]
源文件被分解为预处理标记(2.5)和空白字符序列(包括注释).
执行预处理指令,[...]
并且在令牌中列出了2.5个预处理令牌[lex.pptoken]string-literals
.
因此,首先需要解析来标记字符串文字,"消耗" #else
和dostuff
函数定义.
归档时间: |
|
查看次数: |
1819 次 |
最近记录: |