C++编程 测试#define的不安全性

来源:百度知道 编辑:UC知道 时间:2024/06/02 09:57:55
编写简单程序说明可以使用const替代#define 以消除#define的不安全性

#define ONE 1
#define TWO ONE+ONE

在编译中,ONE替换成1没问题,但是TWO替换成了ONE+ONE即1+1

所以如果2*TWO就会变为2*1+1=3
我们期望2*(1+1)=4

所以利用const代替define是正确的

如果用const int ONE=1;const int TWO=ONE+ONE;则会得到正确结果!

----------------------------------------------------------------

另外,如果
#define ptr int*
ptr a,b;
我们期望a和b都是int*型,但是事实上,a是int*型,b是int型。

如果用 typedef int* ptr;则会得到正确结果!

----------------------------------------------------------------

如果使用
#define MAX(a,b) a>b?a:b

MAX(6,6)+1
会被替换成
6>6?6:6+1
那么结果为:(6>6为假)所以返回6(+比?:优先级高)

所以,他是不安全的

改进方法:
#define MAX(a,b) ((a)>(b)?(a):(b))
宏必须添加许多括号!
但是,执行
int a=5;b=3,c;
c=MAX(a++,b);
的时候,被替换成
c=((a++)>(b)?(a++):(b))
由于替换的错误,所以导致了a自己增加了2次,解决方法是利用内联函数:
inline int MAX(int a,int b){return a>b?a:b;}
但是内联函数不能使用递归、循环等等高级控制结构。

搞错了