宏定义中的括号不正确

时间:2016-04-26 10:25:58

标签: c macros

我正在阅读斯坦福的this教程,他们说:

常见的编码错误:

宏定义中的括号不正确

#define min(a, b) a<b?a:b // incorrect
#define min(a, b) (((a)<(b))?(a):(b)) // correct

我甚至在一个程序中运行它,它工作正常。

任何人都可以解释他们想说的话!

1 个答案:

答案 0 :(得分:4)

如果将第一个版本与其他运算符结合使用,则第一个版本会失败:

min(a , b) + c 

并转换为:

a<b?a:b+c 

与:

相同
a<b?a:(b+c) 

这是一个意外的结果,给出了起始括号。

第二个版本要好得多。它会对其中一个参数进行两次评估,如果函数或i++传递给宏,则会导致意外行为。

应该使用内联函数而不是那些宏。