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中的预处理方案是什么?
海湾合作委员会是正确的。该标准规定:
\n\n\n\n\nC99 6.10.3.4/2(以及 C++98/11 16.3.4/2):如果在替换列表扫描期间找到被替换的宏的名称\n(不包括源文件的其余部分) \xe2\x80\x99s 预处理标记),它不会被替换。
\n
因此,在扩展时A("a" B),我们首先替换B为 Give A("a" A("B"))。
A("B")没有被替换,根据引用的规则,所以最终的结果是L"a" A("B")。