【发布时间】:2016-02-10 16:45:23
【问题描述】:
什么时候需要将定义宏的整个(右)表达式放在括号中?
如果我这样做
#define SUM(x, y) ((x)+(y))
我必须将正确的表达式放在括号中,因为“+”在 C 语言中的优先级较低(如果我在以下上下文中使用它就行不通SUM(x, y) * 5U)
如果我使用最高优先级的运算符,这些括号是否仍然需要,例如
#define F foo()
甚至
#define ACCESS(x, y) (x)->(y)
是否存在会像 SUM() 示例那样破坏实际含义的表达式?)
对于我使用http://en.cppreference.com/w/c/language/operator_precedence的优先规则
【问题讨论】:
-
我不知道必要,但我仍然称其为良好做法。如果有人(比如说)向
F宏添加一个校正因子以(无论如何)规范化foo的输出,但忘记添加括号怎么办?您将花费大量时间试图找出问题所在。 -
另外值得注意的是,您引用的优先级表实际上并不是语言标准,而是标准中更复杂规则的更易于使用的表示.我不是 C 专家或语言律师,但这些规则可能会改变一些事情。