在C中定义宏

Num*_*tor 0 c macros

让我们说我定义一个宏:

#define MAX(x,y)    ((x)>(y)?(x):(y))
Run Code Online (Sandbox Code Playgroud)

如果我打电话MAX(I++,J++)会怎么样?

我无法理解为什么答案不会像预期的那样.

Emi*_*röm 6

宏只适用于预处理器.这是C编译器编译的内容:

(((I++)>(J++))? ((I++):(J++)))
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,如果我比J大,那么我将增加两次并且J 增加一次,否则反之亦然.


你的宏甚至都不正确.这里的括号外层是错误的,这将导致编译错误:

((I++):(J++))
Run Code Online (Sandbox Code Playgroud)

  • 值得一提的是:它是定义的行为,因为在评估左操作数(布尔代码)之后有序列点.这在宏中并不是微不足道的,例如:'MAX(I ++,I ++)`会导致未定义的行为,因为`I`在同一个表达式中增加了两次. (3认同)