我发现 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)
'gcc -E' 给出以下内容:
a + {a + b}
, 而 'cl /E' 发出有关缺少宏参数的警告并产生以下输出:
a + {a, b} +
似乎来自嵌套宏扩展的逗号不被视为参数分隔符。不幸的是,我没有找到在 cl 预处理器中实现的算法的描述,所以我不确定我的建议是否正确。有谁知道 cl 预处理器是如何工作的,它的算法和 gcc 有什么区别?以及如何解释观察到的行为?