现有一个例子:
#define PJ_LOG(level,arg) \
dosomething();\
if (level <= pj_log_get_level()) \
pj_log_wrapper_##level(arg);
现在假设有以下应用:
if(L==1)
PJ_LOG(L,"AAA");
宏转开为:
if(L==1)
dosomething();
if (1 <= pj_log_get_level())
pj_log_wrapper_1("AAA"); ;
显然if(L==1)只管到dosomething();而后面的
if (1 <= pj_log_get_level())
pj_log_wrapper_1("AAA"); ;
则成了独立的语句。
假如使用do{}while(0)语句块,进行宏定义:
#define PJ_LOG(level,arg)do{ \
dosomething();\
if (level <= pj_log_get_level()) \
pj_log_wrapper_##level(arg); \
}while(0)
上述应用转开后为:
if(L==1)
do{
dosomething();
if (1<= pj_log_get_level())
pj_log_wrapper_1("AAA");
}while(0);
这样避免了意外的麻烦。OK现在明白了很多C程序中奇怪的do{}while(0)宏定义了吧