gcc和MS预处理器之间的另一个区别

Ser*_*kov 9 gcc visual-studio c-preprocessor

gcc预处理器和MS VS cl之间的另一个区别.请考虑以下代码段:

# define A(x) L ## x
# define B A("b")
# define C(x) x
C(A("a" B))
Run Code Online (Sandbox Code Playgroud)

对于'gcc -E',我们得到以下内容:

L"a" A("b")
Run Code Online (Sandbox Code Playgroud)

对于'cl/E',输出是不同的:

L"a" L"b"
Run Code Online (Sandbox Code Playgroud)

MS预处理器以某种方式执行额外的宏扩展.它的工作算法明显不同于gcc,但这个算法似乎也是一个秘密.有谁知道如何解释观察到的差异以及MS cl中的预处理方案是什么?

Mik*_*our 5

海湾合作委员会是正确的。该标准规定:

\n\n
\n

C99 6.10.3.4/2(以及 C++98/11 16.3.4/2):如果在替换列表扫描期间找到被替换的宏的名称\n(不包括源文件的其余部分) \xe2\x80\x99s 预处理标记),它不会被替换。

\n
\n\n

因此,在扩展时A("a" B),我们首先替换B为 Give A("a" A("B"))

\n\n

A("B")没有替换,根据引用的规则,所以最终的结果是L"a" A("B")

\n