#define assert(e) if (!e) assert_error(__FILE__,__LINE__)
#define assert(e) \
((void)((e)||_assert_error(__FILE__,__LINE__)))
#define T1 struct foo *
typedef struct foo *T2
在类型定义的时候,正确的使用typedef可以更加通用一些
3) 宏不是一个语句,而是一个表达式。如下例子,
#define assert(e) if(!(e)) _assert_error(__FILE__, __LINE__)
如果程序员使用宏的方法如下,
If (x > 0 && y > 0) assert(x > y); //期望x <=y时,程序终止运行。
else assert(y > x);//期望x>=y时,程序终止运行。
那么就会出现错误。展开之后,代码变为
If(x>0 && y>0) if (!(x>y)) _assert_error(__FILE__,__LINE__);
else if(!(y>x)) _assert_error(__FILE__, __LINE__);
if(!(x>y) 与else匹配了。
一般情况下会将assert宏设计为
#define assert(e) ((e) || _assert_error(__FILE,__LINE))
4)不要用宏来定义类型,尤其不要用宏来定义指针类型。如下例子,
#define T1 int*
typedef int *T2;
T1 a, b; //只有a被声明为了int*, b是int类型。
T2 a, b; //a, b都是int*