=============================================================
标题:c++中谨慎使用#define宏
备注:测试环境为VC2005
日期:2011.3.11
姓名:朱铭雷
=============================================================
1 使用括号更稳妥
#include <iostream>
#include <cstdlib>
using namespace std;
#define DOUBLE(x) x*2
int main()
{
cout << DOUBLE(1) << endl;
int i = 1;
cout << DOUBLE(i+1) << endl;
system("PAUSE");
}
期望的输出结果是:
2
4
但实际的输出结果是:
2
3
原因很简单,DOUBLE(i+1)展开后1+1*2=3,这违背了DOUBLE宏的初衷。
可修改为:
#define DOUBLE(x) ((x)*2 )
2 必要的时候,用函数代替宏,虽然可能会牺牲点效率
#include <iostream>
#include <cstdlib>
using namespace std;
#define POWER(x) ((x)*(x))
int main()
{
int i = 2;
cout << POWER(i) << endl;
cout << POWER(++i) << endl;
system("PAUSE");
}
期望的输出结果是:
4
9
但实际的输出结果是:
4
16
POWER(++i)为什么输出16,可以反汇编看下:
这时候用函数来实现,比用#define宏更稳妥吧,虽然可能效率下降点(多了参数压栈,CALL和RETURN等开销)。
#include <iostream>
#include <cstdlib>
using namespace std;
int power(int x)
{
return x*x;
}
int main()
{
int i = 2;
cout << power(i) << endl;
cout << power(++i) << endl;
system("PAUSE");
}