在网络上,我读到要定义一个行为类似于函数的宏,语法是:
#define foo(x,y) (bar((x),(y)))
但是考虑到宏只是文本替换,为什么使用上面的语法,而不仅仅是
(bar(x,y))
或bar(x,y)
?
如果我写
#define add0(x,y) ((x)+(y))
#define add1(x,y) (x+y)
#define add2(x,y) x+y
打印时所有三个宏都会输出
3
。
不使用括号进行书写可能会导致意外的运算符优先级问题。
考虑以下示例:
#define add2(x,y) x+y
如果调用 add2(1, 2) * 3,它将扩展为 1 + 2 * 3,即 7,而不是 9。这是因为在 C 和 C++ 中,乘法运算符的优先级高于加法运算符。
但是,如果您将宏定义为:
#define add0(x,y) ((x)+(y))
现在已经好了。