有人能解释一下下面的C预处理器宏是如何工作的吗

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

然后,源代码会像这样使用它:
y = SQR(a - b);

因此,这是否与以下相同?如果是,为什么?
#define SQR(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()是计算密集型的,这就为您节省了大量时间。

关于c - 未知类型的C预处理器宏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28268010/

10-11 16:37