宏定义
宏定义中的dowhile(0)
使用do {...}while(0)的核心目的是将宏体封装称一个独立的代码块,避免语法和逻辑错误,可以想象为一个包装盒,将语句包装在一起,不与外界代码互相影响
1.核心作用:让宏成为一个真正的语句
宏定义的本质是文本替换,编译器会在编译阶段将所有宏定义文本进行替换,这时候如果宏语句有多行或是更复杂的执行语句逻辑,便可能与外部语法产生反应使得整体代码出现错误
eg:替换前
#define LOG_PRINTF(ERR) {printf("%d",ERR);}
int main(){
if(err){
LOG_PRINTF(ERR);
}else{
LOG_PRINTF(0);
}
}
替换后:
#define LOG_PRINTF(ERR) {printf("%d",ERR);}
int main(){
if(err){
{printf("%d",ERR);}; //可以看到最后这个;阻断了if语句,此时的else会匹配不到if导致编译错误
}else{
{printf("%d",ERR);};
}
}
如果使用dowhile(0)
#define LOG_PRINTF(ERR) do{printf("%d",ERR);}while(0)
int main(){
if(err){
LOG_PRINTF(ERR);
}else{
LOG_PRINTF(0);
}
}
// 替换后
int main(){
if(err){
do{printf("%d",ERR);}while(0);//代码整体被包裹在结构里,不会影响外部代码
}else{ //并且符合一般编程习惯,语句后加分号
do{printf("%d",ERR);}while(0);
}
}
可以包装多条语句
#define INIT_LOG() do { \
log_file = fopen("log.txt", "w"); \
if (!log_file) exit(1); \
} while(0)
// 调用时
if (need_log)
INIT_LOG(); // 两条语句作为整体执行,不会只执行一部分
dowhile(0)的特性
- dowhile(0)永远只会执行一次,逻辑上等于直接执行块内代码
- 语法上属于单个语句,可以正确被ifelse,for等结构正确包含
- 块内变量被严重限制在循环体中,避免宏体污染i外部变量

浙公网安备 33010602011771号