在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]:

[…]

  1. 源文件被分解成预处理令牌(2.5)和空白字符序列(包括注释)。

  2. 预处理指令被执行,

2.5预处理令牌[lex.pptoken]列出令牌中的string-literals

因此,parsing需要首先对string字面进行标记,“消费” #elsedostuff函数定义。