首页 > 其他分享 >do{}while(0)用法

do{}while(0)用法

时间:2024-02-27 16:48:03浏览次数:15  
标签:do goto dosomething ... 用法 while foo2

更安全的展开宏定义

#define DOSOMETHING foo1(); foo2();

if(condition)
  	DOSOMETHING
  
/*
if(condition)
	foo1();
foo2;
*/

以上代码会导致foo2();始终运行。改为do{}while(0)就可以。do{}while(0)会在任何场景下表现一致。

#define DOSOMETHING \
				do{ \
					foo1();\
          foo2();\
        }while(0)

if(condition)
  	DOSOMETHING

缩小作用域

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

避免goto控制程序流

int foo()
{
    somestruct *ptr = malloc(...);

    dosomething...;
    if(error)
        goto END;
    dosomething...;
    if(error)
        goto END;
    dosomething...;
END:
    free(ptr);
    return 0;
}

goto不符合软件工程的结构化,而且有可能使得代码难懂,所以很多人都不倡导使用,这个时候我们可以使用do{...}while(0)来做同样的事情:

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

    free(ptr);
    return 0;
}

定义空宏

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

标签:do,goto,dosomething,...,用法,while,foo2
From: https://www.cnblogs.com/hellozhangjz/p/18037180

相关文章

  • Docker-Overlay2磁盘空间爆满清理方法
    Docker-Overlay2磁盘空间爆满清理方法在日常线上环境中,我们通常会来做利用Docker来做容器化管理,通过运行容器来执行任务等。但是,随着业务量的不断增大,容器的不断启动,往往会出现磁盘空间不足,1、第一种情况:是因为docker中部署的系统中日志内容的不断扩大。这种情况下,我们可手动,或定......
  • SDOI2024 考前做题
    1.P9126[USACO23FEB]MooRouteIIS首先注意到不一定保证\(r_i\les_i\),否则就是最短路裸题了。注意到此时相当于负权图最短路。spfa也许能过,但是我们想要复杂度确定的写法。利用一下一条边出入时间固定(至少中途不会变)的性质:不难发现每条边最多只会走一次。不妨考虑dfs,记......
  • Docker_学习记录2
    本篇随笔为Docker学习记录(2),所有内容均参考尚硅谷Docker实战教程以及云原生开发安装mysql主从复制新建主服务器容器实例3307dockerrun-p3307:3306\ --namemysql-master\ --privileged=true\ -v/yiran/mysql-master/log:/var/log/mysql\ -v/yir......
  • watchdog模块的使用
    功能当前目录下文件修改会被监控到,并打印日志安装模块pip3installwatchdog运行方式——运行文件即可开启监控,自动监测文件变化importsysimporttimeimportloggingfromwatchdog.observersimportObserverfromwatchdog.eventsimportLoggingEventHandlerif......
  • RK3588 usb otg口实现UVC gadget,作为usb camara向windows 传输图像
    1、打开内核相关配置CONFIG_VIDEO_V4L2_SUBDEV_API=yCONFIG_MEDIA_USB_SUPPORT=yCONFIG_MEDIA_CONTROLLER=yCONFIG_USB_VIDEO_CLASS=yCONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y CONFIG_V4L_PLATFORM_DRIVERS=yCONFIG_MEDIA_CAMERA_SUPPORT=y......
  • uni-app的renderjs示例 | app端使用window
    原文:https://juejin.cn/post/6974552469917401125<template><viewstyle="padding-top:200rpx;"><!--这里的:change:msg旨在于监听逻辑层的msg变化,有变化就调用renderjs内容--><!--这里要注意,render。receiveMsg中的render是下面renderjs定义的module名称-->......
  • Docker部署达梦数据库
    下载下载地址安装#导入镜像dockerload-idm8_20230808_rev197096_x86_rh6_64_single.tar#运行容器dockerrun-d-p5236:5236--namedm8--privileged=true-eCASE_SENSITIVE=N-ePAGE_SIZE=16-eLD_LIBRARY_PATH=/opt/dmdbms/bin-eEXTENT_SIZE=32-eBLANK_......
  • Java 中 MessageFormat.format 用法
    转载自:https://blog.csdn.net/xiaokui_wingfly/article/details/46124057 查看原文:http://www.ibloger.net/article/139.htmlMessageFormat本身与语言环境无关,而与用户提供给MessageFormat的模式和用于已插入参数的子格式模式有关,以生成适用于不同语言环境的消息。Mes......
  • Docker
    docker总结和实例常用命令镜像管理镜像搜索dockerseartch镜像名或者关键词镜像拉取dockerpull镜像名:标签镜像罗列dockerimages镜像删除dockerrmi镜像id或者镜像名:标签镜像导出dockersave-o文件名.tar镜像名:标签镜像导入dockerload......
  • Docker环境安装细步骤
    如果之前已有安装有docker需要重新安装,先进行卸载,如果没安装忽略此步骤yumremovedockerdocker-clientdocker-client-latestdocker-commondocker-latestdocker-latest-logrotatedocker-logrotatedocker-engine安装Docker服务安装yum-utils安装所需的依赖组件软件包,执......