定义宏中的括号

时间:2016-02-10 16:45:23

标签: c macros

什么时候必要将定义宏的整个(右)表达式放在括号中?

如果我做的话

#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

的优先规则

2 个答案:

答案 0 :(得分:2)

使用括号避免一些大错误是一个好习惯。目前您可能认为您的运算符具有较高的优先级,但假设您正在制作代码的头文件并将其提供给您的朋友,该朋友使用该文件中的宏,该函数具有更高的优先级,因此当时它将是一个调试代码非常痛苦。您可以通过括号将这段时间保存为程序员。

答案 1 :(得分:1)

一些使用简单#defines的程序员会写

#define ZERO (0)

除了使事情复杂化之外没有用。

实际上这个宏是如此,所以考虑到这一点你可以决定需要哪些括号:

SUM(3,4) => ((3)+(4))    // parentheses around 3 and 4 are not necessary

RATIO(3+4,4+5) => ((3+4)/(4+5))    // probably necessary here due to operator precedence

这不是解决这个问题的火箭科学,实际上非常简单。