【问题标题】:Preprocessor behind the scenes, how does it interpret the following lines of code C++ [duplicate]幕后的预处理器,它如何解释以下代码行 C++ [重复]
【发布时间】:2016-11-16 13:51:33
【问题描述】:

所以我为这个基本的平方函数使用了一个预处理宏:

#define SQUARE(a) a*a

然后将其传递给这些函数,以分别执行这些任务:

double f(double x) {
    return SQUARE(x);
}
double g(double x) {
    return SQUARE(1-x);
}
double h(double x) {
    return 1/SQUARE(x);
}

使用这些函数,对于 g(x) 和 h(x),我得到的结果如下:

 g(2) = -3, h(2) = 1
 g(3) = -5, h(3) = 1
 g(4) = -7, h(4) = 1
 etc...

我已经更改了函数以获得它们预期的结果,但我很好奇上述函数中发生了什么给我这样奇怪的结果?

【问题讨论】:

标签: c++ macros c-preprocessor


【解决方案1】:

SQUARE(1-x) 将扩展为 1-x*1-x,这根本不正确。

使用函数而不是宏会好得多。一个函数只计算一次参数。

double square(double a)
{ return a * a; }

【讨论】:

  • 我的问题的重点不是代码评估,而是询问幕后发生的事情,这给了我结果。这段代码,我完全知道是不正确的,并没有在我的最终程序中使用,我只是想知道为什么它是错误的
  • @NoName 从字面上看,这个答案的第一句话解释了幕后发生的事情。
  • 感谢关于括号的链接,但我不明白为什么这篇文章值得被否决,我只是得到了这个公式并要求给出修复,但我通过更改解决了它这个 #define f(x) x*x #define g(x) f((1-x)) #define h(x) 1/(f(x)) 的宏,原件没有括号,我不知道这是问题的原因
  • @NoName 括号是问题之一,但还有更多问题(而且您的“固定”代码甚至无法解决括号问题)。这里真正的解决方案是不使用宏。出于兴趣,您为什么要使用宏而不是函数?你认为这有什么作用?事实上,宏在这里no 的用途是完全错误的。使用函数。
  • 我刚刚在上面解释过,给了我一个宏,并负责在这些函数的上下文中修复它(这是 Uni assignment 的问题),我做了,但不知道为什么它一开始就不起作用,但就像 Bo 说的那样,这是由于括号和错误扩展,别担心,我不想使用宏,而且比你想要的更多
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-17
  • 2012-12-11
  • 1970-01-01
  • 1970-01-01
  • 2013-03-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多