我发现Microsoft Visual Studio编译器和gcc以不同的方式预处理以下小片段:
# define M3(x, y, z) x + y + z
# define M2(x, y) M3(x, y)
# define P(x, y) {x, y}
# define M(x, y) M2(x, P(x, y))
M(a, b)
Run Code Online (Sandbox Code Playgroud)
'gcc -E'给出以下内容:
a + {a + b}
Run Code Online (Sandbox Code Playgroud)
,'cl/E'发出关于缺少宏参数的警告并产生以下输出:
a + {a, b} +
Run Code Online (Sandbox Code Playgroud)
似乎来自嵌套宏扩展的逗号不被视为参数分隔符.不幸的是,我没有找到cl预处理器中实现的算法的描述,所以我不确定我的建议是否正确.有谁知道cl预处理器是如何工作的,它的算法和gcc之间有什么区别?以及如何解释观察到的行为?
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中的预处理方案是什么?