gpt4 book ai didi

c - 在 C 中始终将定义括在括号中是否有充分的理由?

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

显然,有些时候 #define 语句必须有括号,如下所示:

#define WIDTH 80+20

int a = WIDTH * 2; // expect a==200 but a==120

所以我总是用括号括起来,即使它只是一个数字:

#define WIDTH (100)

C 的新手问我为什么这样做,所以我试图找到一种边缘情况,即单个数字 #define 上缺少括号会导致问题,但我想不出一个。

有这样的情况吗?

最佳答案

。预处理器连接运算符 (##) 会导致问题,例如:

#define _add_penguin(a) penguin ## a
#define add_penguin(a) _add_penguin(a)

#define WIDTH (100)
#define HEIGHT 200

add_penguin(HEIGHT) // expands to penguin200
add_penguin(WIDTH) // error, cannot concatenate penguin and (100)

同样适用于字符串化 (#)。显然,这是一个极端情况,考虑到 WIDTH 的使用方式可能无关紧要。尽管如此,关于预处理器还是要记住这一点。

(添加第二只企鹅失败的原因是 C99 中预处理规则的一个微妙细节 - iirc 它失败是因为连接到两个非占位符预处理标记必须始终导致单个预处理标记- 但这无关紧要,即使允许串联,它仍然会给出与未加括号的 #define!) 不同的结果。

所有其他响应仅在从 C++ 扫描器的角度来看无关紧要的范围内才是正确的,因为数字确实是原子的。但是,根据我对问题的阅读,没有迹象表明只应考虑没有进一步预处理器扩展的情况,因此即使我完全同意其中包含的建议,其他答复也是错误的。

关于c - 在 C 中始终将定义括在括号中是否有充分的理由?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9081479/

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