宏定义

宏定义中的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外部变量
posted @ 2025-11-29 02:26  lskyl  阅读(0)  评论(0)    收藏  举报