0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言-宏定义中使用do{...} while(0)到底图个啥

嵌入式那些事 来源:嵌入式那些事 2023-06-11 10:59 次阅读

Linux 内核中,经常会看到do{} while(0)这样的语句,许多人开始都会疑惑,认为do{} while(0)毫无意义,因为它只会执行一次,加不加do{} while(0)效果是完全一样的,其实do {}while(0)的用法主要用于宏定义中。

这里用一个简单的宏来演示:

#defineSAFE_FREE(p)do{free(p);p=NULL;}while(0)

假设这里去掉do...while(0),即定义SAFE_DELETE为:

#defineSAFE_FREE(p)free(p);p=NULL;

那么以下代码:

if(NULL!=p)
SAFE_DELETE(p)
else
.../*dosomething*/

会被展开为:

if(NULL!=p)
free(p);p=NULL;
else
.../*dosomething*/

展开的代码中存在两个问题。

(1)、因为 if 分支后有两个语句,导致 else 分支没有对应的 if,编译失败。

(2)、假设没有 else 分支,则 SAFE_FREE 中的第二个语句无论 if 测试是否通过,都会执行。

的确,将SAFE_FREE的定义加上{}就可以解决上述问题了,即:

#defineSAFE_FREE(p){free(p);p=NULL;}

这样,代码:

if(NULL!=p)
SAFE_DELETE(p)
else
.../*dosomething*/

会被展开为:

if(NULL!=p)
{free(p);p=NULL;}
else
.../*dosomething*/

但是,在 C 程序中,每个语句后面加分号是一种约定俗成的习惯,那么,如下代码:

if(NULL!=p)
SAFE_DELETE(p);
else
.../*dosomething*/

将被扩展为:

if(NULL!=p)
{free(p);p=NULL;};
else
.../*dosomething*/

这样,else 分支就又没有对应的 if 了,编译将无法通过。假设用了do {} while(0),情况就不一样了,同样的代码会被展开为:

if(NULL!=p)
do{free(p);p=NULL;}while(0);
else
.../*dosomething*/

不会再出现编译问题。do while(0)的使用完全是为了保证宏定义的使用者能在不出现编译错误的情况下使用宏,它不对其使用者做任何假设。





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7551

    浏览量

    131876
  • LINUX内核
    +关注

    关注

    1

    文章

    313

    浏览量

    21431

原文标题:C语言-宏定义中使用do {...} while(0)到底图个啥

文章出处:【微信号:嵌入式那些事,微信公众号:嵌入式那些事】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    C语言whiledo-while循环的用法

    循环是一种重要的控制结构,可以使程序重复执行一段代码,直到满足特定条件为止。在C语言中,whiledo-while是两种常用的循环结构,本文将详细介绍这两种循环的用法。
    发表于 08-18 16:35 1263次阅读
    C<b class='flag-5'>语言</b>中<b class='flag-5'>while</b>和<b class='flag-5'>do-while</b>循环的用法

    C语言常用定义技巧(转)

    C语言常用定义技巧
    发表于 07-26 12:47

    C语言定义技巧

    C语言定义技巧
    发表于 03-01 21:58

    C语言定义中#和##的作用

    ,format,args...) \do{printf("[%s]",#level);printf(format,##args);}while(0)SLOG(ERR,"
    发表于 08-23 18:22

    C语言中的

    定义是我们C语言学习中非常重要的内容。一些基础的用法大家都比较清楚了,我们简单总结一下。1.定义
    发表于 12-13 15:32

    c语言中常用的定义有哪些?

    c语言中常用的定义有哪些?
    发表于 04-28 06:01

    【原创文章】程序的调试和使用的技巧

    就没有以上的问题,而且一般的C语言编译器都会对do...while(0)进行优化,使其和一般的一条函数等价,在其中可以含有任意条语句。
    发表于 08-18 17:27

    C语言定义使用do{}while(0)的好处是什么

    C语言定义使用do{}while(0)的好处1.
    发表于 02-25 06:28

    C++语言基础讲解视频do while循环语句

    C++语言基础讲解视频do while循环语句
    发表于 01-14 15:32 5次下载

    Proteus之do-while语句的应用

    Proteus之do-while语句的应用,很好的Proteus资料,快来学习吧。
    发表于 04-18 14:49 0次下载

    HAL库中do{...} while(0U) 宏定义的作用和意义

    HAL库中do{...} while(0U)宏定义的作用和意义
    的头像 发表于 03-03 14:07 3106次阅读

    do{...} while(0U) 这种代码的作用和意义

    库的朋友都知道,源码里面有许多do{...} while(0U)的宏定义语句。   今天讲的主要知识点是:HAL库中do{...} while
    的头像 发表于 06-04 14:00 2362次阅读
    <b class='flag-5'>do</b>{...} <b class='flag-5'>while</b>(0U) 这种代码的作用和意义

    C语言基础:宏定义使用do{}while(0)的好处

    C语言定义使用do{}while(0)的好处1. 概述 经常写项目代码,有时需要用到宏定义,而宏定义
    发表于 01-13 13:06 2次下载
    C<b class='flag-5'>语言</b>基础:宏<b class='flag-5'>定义</b>使用<b class='flag-5'>do</b>{}<b class='flag-5'>while</b>(0)的好处

    C程序中do{}while(0)宏定义的作用

    在嵌入式开发中,宏定义非常强大也非常便捷,如果正确使用可以让你的工作事半功倍。然而,在很多的C程序中,你可能会看到不是那么直接的比较特殊一点的宏定义,比如do{}while(0)。
    的头像 发表于 05-23 12:44 2311次阅读

    如何去区分whiledo while 的用法

    如何去区分whiledo while 的用法。 2 方法 Do while
    的头像 发表于 02-24 10:40 796次阅读