未知类型的 C 预处理器宏

Unknown type of C preprocessor macro

谁能解释一下下面的 C 预处理器宏是如何工作的:

#define SQR(a) (sqrarg=(a),sqrarg*sqrarg)

源代码然后像这样使用它:

y = SQR(a - b);

这是否与以下相同,如果是,为什么?

#define SQR(a) ((a)*(a))

提前致谢!

展开后

y = (sqrarg=(a-b), sqrarg*sqrarg); 

, 是一个逗号运算符,因此首先 sqrarg=(a-b) 将被评估,并且 a-b 将被分配给 sqrarg,表达式 sqrarg=(a-b) 的值将被丢弃。之后 sqrarg*sqrarg 将被评估并将结果分配给 y

Is this therefore the same as the following and if so why?

 #define SQR(a) ((a)*(a))  

是的。除了后者, a 将被评估两次。

我认为你问题中 SQR 的第一种形式背后的想法是,如果 SQR() 的参数是一个函数,它只会被评估一次。也就是说,如果您有:

#define SQR(a) ((a)*(a))

你的代码中有:

myval = SQR(myfunction())

这将计算为:

myval = (myfunction() * myfunction())

而如果您有:

#define SQR(a) (sqrarg=(a),sqrarg*sqrarg)

计算结果为:

myval = (sqrarg=(myfunction()), sqrarg*sqrarg)

只调用 myfunction() 一次。如果 myfunction() 是计算密集型的,这刚刚为您节省了大量时间。