打印
[技术相关]

宏定义代码块之 do{} while(0) 的使用

[复制链接]
564|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tpgf|  楼主 | 2023-11-14 09:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在C语言中,do{} while(0) 是一个常见的编程技巧,用于创建一个包含多条语句的代码块,并将其作为单个语句使用。尽管看起来不太直观,但它有一些实际的应用。

// 宏定义,包含多条语句
#define MULTI_STATEMENTS               \
    do {                               \
        printf("这是第一条语句\n");     \
        printf("这是第二条语句\n");     \
        printf("这是第三条语句\n");     \
    } while (0)
主要的目的是为了解决宏定义在使用时可能引发的一些问题,例如宏定义中的分号和大括号的使用。在使用宏定义时,如果没有使用do{} while(0),可能会导致一些语法错误或逻辑问题。

使用 do{} while(0) 的好处是:
1. 它创建了一个作用域,允许在宏定义中使用局部变量。当你的功能很复杂,变量很多你又不愿意增加一个函数的时候,使用do{}while(0);,将你的代码写在里面,里面可以定义变量而不用考虑变量名会同函数之前或者之后的重复。

如果你有一个复杂的函数,变量很多,而且你不想要增加新的函数,可以使用do{…}while(0),将你的代码写在里面,里面可以定义变量而不用考虑变量名会同函数之前或者之后的重复。

这种情况应该是指一个变量多处使用(但每处的意义还不同),我们可以在每个do-while中缩小 作用域

int key;
stringvalue;
int func()
{
    int key = GetKey();
    stringvalue = GetValue();
    dosomething for key,value;
    do{
        int key;stringvalue;
        dosomething forthis key,value;
    }while(0);   
}

2. 它可以让宏定义中的多条语句在逻辑上看起来像是一个语句,而不是多个独立的语句。很多宏实现都使用do/while(0)来包裹他们的逻辑,这样不管在调用代码中怎么使用分号和大括号,而该宏总能确保其行为是一致的。

定义一个包含多条语句的宏定义代码段:

#define EXECUTE()
        do1();
        do2();
在if条件调用后,误以为只是执行一条语句,无需使用大括号。

if(a>0)
    EXECUTE();
然而实际展开后,是一段多条语句的代码段,条件判断只会对展开后的第一条语句起作用。无论代码中的a是否大于0,都会执行do2()函数。

if(a>0)
    do1();
    do2();
下面是一个示例,展示了使用 do{} while(0) 的宏定义的情况:

#define MY_MACRO do { \
    // 这里是宏定义中的多条语句 \
    // 可以使用局部变量 \
    int x = 10; \
    printf("x 的值:%d\n", x); \
} while(0)

int main() {
    // 使用宏定义
    MY_MACRO;

    // 后续的代码
    printf("后续的代码\n");

    return 0;
}

在这个示例中,MY_MACRO  是一个宏定义,使用 do{} while(0)  包裹了多条语句。在  main  函数中,我们可以像使用单个语句一样使用  MY_MACRO ,并且后续的代码不会受到宏定义中的多条语句的影响。

总而言之, do{} while(0)  的作用是为了解决宏定义在使用时可能引发的一些问题,确保宏定义可以作为单个语句使用,并且在逻辑上看起来像是一个语句。
————————————————
版权声明:本文为CSDN博主「嵌入式小宁」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_53592457/article/details/131550250

使用特权

评论回复
沙发
zwsam| | 2023-11-25 20:39 | 只看该作者

使用特权

评论回复
板凳
Henryko| | 2023-11-27 10:22 | 只看该作者
第二个比较常用

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1897

主题

15568

帖子

11

粉丝