为什么宏会返回我们不期望的内容

时间:2010-07-03 19:07:32

标签: c++ macros

  

可能重复:
  Problem with Macros

大家好

我定义了这个宏:

#define SQ(a) (a*a)

以这种方式调用它:

std::cout << SQ(2+3) << '\n';

输出为11.为什么?

由于

4 个答案:

答案 0 :(得分:4)

宏只进行简单的文本操作,即它们非常愚蠢,因为它们看不到“代码”,只有“文本”然后被发送到C / C ++解析器用于验证。

SQ(2+3)变为(2+3*2+3)

这就是为什么你应该使用更聪明的模板,他们会做你想要的:首先计算2 + 3,然后做5 * 5.

答案 1 :(得分:3)

因为示例中SQ的扩展会给出:

std::cout << (2+3*2+3) << '\n';

定义宏的更好方法是

#define SQ(a) ((a)*(a))

解决了这种情况下的优先问题。

最好还是使用一个函数来避免传递的表达式被多次评估的任何问题。

E.g。作为模板:

template<class T>
T SQ(T a) { return a * a; }

答案 2 :(得分:2)

修复您的宏:

#define SQ(a) ((a)*(a))

答案 3 :(得分:1)

其他人已经有了答案。 “修复”(如果你必须使用宏)就是用parens包裹你所有的参数,例如

#define SQ(a) ((a)*(a))

在大多数情况下,最好使用模板,因为这仍然会为了速度执行编译时扩展,但也为语法和类型检查提供语言支持。