博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++ do{...}while(0)的好处
阅读量:7265 次
发布时间:2019-06-29

本文共 1419 字,大约阅读时间需要 4 分钟。

在开源软件里面经常可以看到这样的写法。

#define X(a) do { f1(a); f2(a); } while(0)

1. 主要作用是放在宏定义里面,避免宏带来的语法问题。

比如

#define DOSOMETHING()\               cmd1;\               cmd2; 而调用的时候
if(a>0)    DOSOMETHING(); 会有问题,需要用到上面提到的 而这时候,为什么不用 if (1) { ... } 呢? 有两方面原因: 首先,会多出不必要的分号,比如:
if (1) my_code; 另外更重要的是,有if-else的问题:
if (1) my_code; else { ... } 当然了,如果定义成
#define X(a) if(1) { f1(a); f2(a); } else{} 就和下面的 do...while(0)一样安全了。但是上面的if-else写法不需要写分号;,有利有弊。
#define X(a) do { f1(a); f2(a); } while(0)

2. 还有一个重要原因是,可以用来取代goto跳转

比如下面带goto的代码:

int foo(){    somestruct* ptr = malloc(...);     dosomething...;    if(error)    {        goto END;    }     dosomething...;    if(error)    {        goto END;    }    dosomething...; END:    free(ptr);    return 0; }

可以利用do...while(0)和break的配合,写成:

int foo(){     somestruct* ptr = malloc(...);     do{        dosomething...;        if(error)        {            break;        }         dosomething...;        if(error)        {            break;        }        dosomething...;    }while(0);     free(ptr);    return 0; }

goto转换为do...while+break,在程序结构上、编译优化上,都有很多好处。我觉得。

 

3、避免空宏引起的warning

内核中由于不同架构的限制,很多时候会用到空宏,在编译的时候,空宏会给出warning,为了避免这样的warning,就可以使用do{}while(0)来定义空宏:

#define EMPTYMICRO do{}while(0)

我觉得,这个也可以用if-else来代替。

 

4、定义一个单独的函数块来实现复杂的操作,避免作用域或者命名空间冲突

当你的功能很复杂,变量很多你又不愿意增加一个函数的时候,使用do{}while(0);,将你的代码写在里面,里面可以定义变量而不用考虑变量名会同函数之前或者之后的重复

 

(完)

 

转载于:https://www.cnblogs.com/charlesblc/p/6080315.html

你可能感兴趣的文章
自动签到升级版(JS实现的每日定时任务)
查看>>
am335x文件系统 /etc/fstab的设置
查看>>
JS魔法堂:被玩坏的innerHTML、innerText、textContent和value属性
查看>>
90社交网络的行为报告后:不拒绝陌生人,TFBOYS作为一个喜爱
查看>>
What does the number on the visual studio solution icon represent?
查看>>
从hadoop 要删除字符串匹配指定的任务
查看>>
html name id, 与服务器交互必须有name
查看>>
启用多处理器编译--加快VS2013编译
查看>>
CodeForces Round#229 DIV2 C 递归DP
查看>>
zebra/quagga
查看>>
E. Mike and Foam(容斥原理)
查看>>
[每日电路图] 3、无线充电原理解析及经典设计方案集锦【转+解读】
查看>>
【filezilla】 ubuntu下安装filezilla
查看>>
HDU 4839 The Game of Coins _(:зゝ∠)_
查看>>
反射机制、依赖注入、控制反转
查看>>
《Spring技术内幕》学习笔记17——Spring HTTP调用器实现远程调用
查看>>
PHP在Windows下安装配置第一步
查看>>
SlipButton——滑动开关
查看>>
用“MEAN”技术栈开发web应用(三)用mongodb搭建数据库
查看>>
17 个 tar 命令实用示例【转】
查看>>