显然,有时#define
条语句必须有括号,如下所示:
#define WIDTH 80+20
int a = WIDTH * 2; // expect a==200 but a==120
所以我总是用括号括起来,即使它只是一个数字:
#define WIDTH (100)
有些C新手问我为什么要这样做,所以我试着找出一个边缘情况,在这种情况下,单个数字#define
上没有括号会导致问题,但我想不出这样的情况.
这种情况是否存在?
显然,有时#define
条语句必须有括号,如下所示:
#define WIDTH 80+20
int a = WIDTH * 2; // expect a==200 but a==120
所以我总是用括号括起来,即使它只是一个数字:
#define WIDTH (100)
有些C新手问我为什么要这样做,所以我试着找出一个边缘情况,在这种情况下,单个数字#define
上没有括号会导致问题,但我想不出这样的情况.
这种情况是否存在?
Yes.预处理器串联运算符(##
)将导致问题,例如:
#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
的使用方式,这可能无关紧要.尽管如此,预处理器还是需要记住的.
(添加第二个penguin失败的原因是C99-iirc中预处理规则的一个微妙细节.它失败是因为连接到两个非占位符预处理令牌必须始终导致一个预处理令牌——但这与此无关,即使允许连接,它仍然会给出与unbr不同的结果.)#define
岁!).
所有其他的响应都是正确的,只要从C++ scanner 的Angular 来看,这并不重要,因为,实际上,原子是原子.然而,就我对这个问题的理解而言,没有迹象表明只应考虑没有进一步预处理器扩展的情况,因此其他回答是错误的,尽管我完全同意其中的建议.