可能重复:
Problem with Macros
大家好
我定义了这个宏:
#define SQ(a) (a*a)
以这种方式调用它:
std::cout << SQ(2+3) << '\n';
输出为11.为什么?
由于
答案 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))
在大多数情况下,最好使用模板,因为这仍然会为了速度执行编译时扩展,但也为语法和类型检查提供语言支持。