特殊符号##
“##”是一种分隔连接方式,它的作用是先分隔,然后进行强制连接。
例如:
#define TYPE(num) t_num_t
上面的程序程序当调用 TYPE(3)时,本身想宏替换为 t_3_t,但是实际还是会是 t_num_t,因为 t_num_t
是一个整体,那么这个时候可以改用这样一种方式:
#define TYPE(num) t_##num##_t
这样的话程序在处理的时候就会看成是三个部分 t_,num,_t,就能正确替换为 t_3_t.
宏定义的{…}写法和 do{…}while(0)写法
第一种情况:当我们定义一个宏定义时 例如:
#define TYPE(num)
如果我们空定义的话,那么当我们来引用它时就会报警告,于是我们可以选择这样:
#define TYPE(num) do{}while(0)
这样就能避免警告
第二种情况:当我们定义一个宏如下:
#define TYPE()\ {fun1(); fun2();}
当我们这样去引用它时:
if(...) TYPE(); else //error parse error before else fun();
会出现错误,因为替换后会多出一个分号,为了避免这样的宏定义错误,建议定义复杂 的宏时使用 do{}while(0)的方式:
#define TYPE()\ do {fun1(); fun2();}while(0)