幕后预处理器,它如何解释以下代码行C ++

时间:2016-11-16 13:51:34

标签: c++ macros c-preprocessor

所以我正在为这个基本的方形函数使用预处理宏:

#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...

我已经更改了功能以获得预期的结果,但我很好奇上面的函数中发生的事情给我带来了如此奇怪的结果?

1 个答案:

答案 0 :(得分:1)

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

使用函数而不是宏会好得多。函数只评估参数一次。

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