在C ++ 11中应该先发生什么:原始string扩展或macros?
此代码在Visual C ++ 2013中工作,但不在gcc / clang中:
#if 0 R"foo( #else int dostuff () { return 23; } // )foo"; #endif dostuff();
Visual C ++首先删除if 0。 Clang首先扩展R原始string(并且从不定义dostuff)。 谁是对的,为什么?
GCC和叮当是对的,VC ++是错误的。
2.2翻译阶段[lex.phases]:
[…]
源文件被分解成预处理令牌(2.5)和空白字符序列(包括注释)。
预处理指令被执行,
2.5预处理令牌[lex.pptoken]列出令牌中的string-literals
。
因此,parsing需要首先对string字面进行标记,“消费” #else
和dostuff
函数定义。