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

    文章

    7618

    浏览量

    138664
  • LINUX内核
    +关注

    关注

    1

    文章

    316

    浏览量

    21860

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

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

收藏 人收藏

    评论

    相关推荐

    C语言定义使用技巧

    写好C语言,漂亮的定义很重要,使用定义可以防止出错,提高可移植性,可读性,方便性等等。下面列
    发表于 07-29 09:35 1154次阅读

    C语言中常用的定义

    写好C语言,漂亮的定义很重要,使用定义可以防止出错,提高可移植性,可读性,方便性等等。下面列
    发表于 10-18 10:05 1810次阅读

    C语言定义的应用

    C语言中,定义是一种预处理指令,用于在代码中定义和使用常量、函数或代码片段的替代。
    发表于 08-17 15:33 980次阅读

    C语言whiledo-while循环的用法

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

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

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

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

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

    C语言定义使用技巧

    写好C语言,漂亮的定义很重要,使用定义可以防止出错,提高可移植性,可读性,方便性 等等。下面
    发表于 11-13 12:04 36次下载

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

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

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

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

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

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

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

    C语言定义使用do{}while(0)的好处1.
    发表于 01-13 13:06 2次下载
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>基础:<b class='flag-5'>宏</b><b class='flag-5'>定义</b>使用<b class='flag-5'>do</b>{}<b class='flag-5'>while</b>(<b class='flag-5'>0</b>)的好处

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

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

    c语言定义可以嵌套吗?

    c语言定义可以嵌套吗? C语言
    的头像 发表于 09-04 17:38 3367次阅读

    c语言带参数的定义

    c语言带参数的定义  C语言
    的头像 发表于 09-04 17:45 2596次阅读

    do{}while(0)只执行一次有意义吗?

    在嵌入式开发中,定义非常强大也非常便捷,如果正确使用可以让你的工作事半功倍。然而,在很多的C程序中,你可能会看到不是那么直接的比较特殊一点的定义
    的头像 发表于 10-09 14:20 819次阅读
    <b class='flag-5'>do</b>{}<b class='flag-5'>while</b>(<b class='flag-5'>0</b>)只执行一次有意义吗?