【发布时间】:2020-04-28 23:11:47
【问题描述】:
谁能解释每一步发生了什么? 我知道最终输出是 140.5,但我不确定为什么会这样。导致 140.5 的每一行发生了什么?
#define PI 3.1
#define calcCircleArea(r) (PI * (r) * (r))
#define calcCylinderArea(r,h) (calcCircleArea(r) * h)
int main() {
double i = calcCylinderArea(3.0,5.0 + 1); printf("%g", i);
}
【问题讨论】:
-
运行
cc -E -o preprocessed.c source.c并查看结果。 -
首先记住(或了解)宏在编译时被扩展。基本上发生的事情是宏“调用”被宏的主体取代。现在要了解发生了什么,请尝试自己一个一个地扩展宏,直到你有一个非宏表达式。请注意,大多数编译器都可以选择为您执行此操作(向您显示预处理文件)。
-
你有一个错误:因为
calcCylinderArea是一个CPP 宏,并且因为你将5.0 + 1传递给h,[其中x是@987654327 @ ...]你会[有效地]得到(x * 5.0) + 1而不是(x * (5.0 + 1),这就是你想要的。这是因为乘法比加法具有更高的优先级,因此将首先执行乘法,然后然后将对其应用加法。在h周围添加括号[就像您在calcCircleArea中为r所做的那样。即:#define calcCylinderArea(r,h) (calcCircleArea(r) * (h)) -
感谢您的所有 cmets!我知道这段代码不是很好,并且有一个错误。我不是在寻找解决办法,而是更多地从概念上理解正在发生的事情。相反,我试图了解在此过程中每个级别都发生了什么(我是#define 的新手)。感谢您的 cmets 和您的帮助:)