一、#define使用误区
(1)宏不是函数
eg:#define abs(x) ((x)>=0?(x) : -(x)) //好的定义方法
()是必须的,他们的作用是预防引起与优先级有关的问题。例如:我们定义宏:
#define abs(x) x>=0?x: -x //不好的定义
看看abs(a-b)求值的结果:
a-b>=0?a-b:-a-b
而不是我们要的:a-b>=0?a-b:-(a-b)
看看abs(a)+1求值的结果:
a>=0?a:-a+1
而不是我们要的:(a>=0?a:-a)+1
(2)宏不是类型定义
eg: #define char* str
看看str a,b;展开的结果:
char *a,b;
而不是我们要的:char *a,*b;
typedef可以实现
更多内容参考《C陷阱与缺陷》
二、typedef使用误区
(1)typedef不允许“组合”
定义:typedef int INT32;
不允许这样用:unsinged INT32 a; //错误
使用#define就没这个问题,因为它只是简单的展开
(2)
定义:typedef char* str;
这样使用:const str s;
s是:const char* s; //s是一个指向const char的指针
还是:char * const s; //s是一个指向char的const指针
答案是后者,因为当用typedef定义了一种新的类型str后,const修饰的对象就是str,二str本身是指针,于是const str的意思就是str的值是常量,即str是常量指针。
更多内容参考《c/c++深层探索》