#define如何在C ++中工作

时间:2018-08-11 16:07:55

标签: c++

#include <iostream>
using namespace std;

#define squareOf(x) x*x

int main() {
// your code goes here
int x;
cout<<squareOf(x+4);
return 0;
}

我以为答案会是16,但答案是4。 我很困惑这是如何工作的。

1 个答案:

答案 0 :(得分:6)

16永远不会是这里的结果。假设您将x初始化为0,然后将x + 4替换为x + 4 * x + 4,其结果为0 + 4 * 0 + 4 = 4。

预处理器宏替换源代码,它们是不是函数。

您现在可能会认为

#define squareOf(x) (x)*(x)

会更好,但是请考虑

int x = 2;
int y = squareOf(x++);

将导致y =(2)*(3)= 6,而不是4。

如果您没有很好的理由,请避免使用 预处理程序宏。有充分的理由,但是如果某些东西的行为类似于函数,则最好使其成为函数。

现在来看一下:

template <class T>
inline T squareOf(const T& number)
{
    return number*number;
}

作为内联,它也确实会替换代码(至少在编译器需要的情况下),但是在这里,此代码实际上就像一个函数(因为它是一个函数)。不会期望那个结果会很糟糕。