以下宏可能给应用程序带来哪些问题?

时间:2012-11-15 16:07:58

标签: c++ c macros

以下宏会带来问题吗?

#define sq(x) x*x

如果是,那么如何以及为什么?请帮忙。

6 个答案:

答案 0 :(得分:9)

是的,它可能会出现问题。除了明显的事实,即宏根本不尊重命名空间(这意味着你不能调用其他任何东西sq),请尝试以下方法:

int result = sq(4) / sq(4);

您应该用括号括起x * x,使其成为((x) * (x))

另一个问题:

int a = 0;
int result = sq(++a);

这是宏的固有问题,也是首选内联函数的原因之一。

答案 1 :(得分:4)

我不会给你一个直接的答案(这看起来像是一个家庭作业问题),但我会给你一个例子,希望能让你思考并提出一个正确答案:< / p>

#include <iostream>

#define sq_macro(x) x * x

int sq_function(int x)
{
    return x * x;
}

int print_and_ret(int x)
{
    std::cout << x << '\n';
    return x;
}

int main()
{
    std::cout << "Calling sq_macro:\n";
    sq_macro(print_and_ret(10));

    std::cout << "Calling sq_function:\n";
    sq_function(print_and_ret(10));
}

运行程序时,宏和函数会给出两种不同的行为。想想宏是什么,以及功能是什么。

答案 2 :(得分:3)

编写宏时使用括号过多。重写宏如下

#define sq(x) ((x)*(x))

如果您不这样做,那么在将宏用作sq(5+4)时会出现问题

要了解问题,请执行宏扩展并查看。

答案 3 :(得分:2)

正如所指出的那样,你应该在括号中包含参数的每次使用以确保正确的行为,例如,当参数类似于i * 2时:

#define sq(x) ((x)*(x))

但还有另一个潜在的问题。请考虑以下事项:

result = sq(++i);

这被翻译为:

result = ((++i)*(++i))

意图可能只增加i一次,它会增加两次。这是宏的常见副作用。

一种方法是在调用它时要注意这一点,但更好的方法是将sq()放在它自己的内联函数中。

答案 4 :(得分:1)

所有这些都可能导致麻烦:

int x = 12;
int n = sq(x+3);
int y = sq(x++);
int z = 2 * sq(2 + n) * n;

与函数sq比较。

答案 5 :(得分:1)

首先,运算符优先级会搞砸:

sq(2+2); // author wants 4*4, but gets 2+2*2+2.