gpt4 book ai didi

c - gcc 和 Microsoft 预处理器之间的区别

转载 作者:太空狗 更新时间:2023-10-29 16:31:06 26 4
gpt4 key购买 nike

我发现 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 的算法有什么区别?以及如何解释观察到的行为?

最佳答案

# 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)

让我们逐步手动推出:

M(a, b)
--> M2(a, P(a, b))
--> M2(a, {a, b})

标准说:

The individual arguments within the list are separated by comma preprocessing tokens, but comma preprocessing tokens between matching inner parentheses do not separate

只提到了括号,所以...

--> M3(a, {a, b})
--> a + {a + b}

重要:

M3(a, {a, b})

这里,根据之前引用的标准,三个“参数”被传递给 M3(使用单引号来描述标记/参数):

M3('a', '{a', 'b}')

扩展为

'a' + '{a' + 'b}'

这就是 cpp (4.6.1) 逐字给出的内容:

# 1 "cpp.cpp"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "cpp.cpp"




a + {a + b}

cpp(或 gccg++)是正确的,MSVC 不是。

作为贵族,确保存在错误报告。

关于c - gcc 和 Microsoft 预处理器之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11469462/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com