c++中使用do { } while (0)宏定义

C++中do...while(0)的妙用 一点睛 do{...}while(condition)可以表示循环,但你有没有遇到在一些地方宏定义中可以不用循环的地方,也用到了do{...}while(condition),比如有这样的宏: #define Foo(x) do{\ printf("first statement\n");\ printf("second statement\n");\ }while(0) ... 阅读详情

在C++中,使用do { } while (0)宏定义是一种常见的技巧,用于创建类似函数的宏。这种宏结构可以避免许多常见的宏定义问题,如意外的行为或语法错误。以下是具体场景及其原因:

场景和原因

  1. 防止宏的单行限制和语句组合问题:
    如果宏定义包含多行代码,并且在使用时没有加上花括号 {},可能会导致意外的行为。例如,假设有如下宏:

    #define MY_MACRO a = 1; b = 2;
    

    使用时:

    if (condition)
        MY_MACRO;
    else
        doSomethingElse();
    

    上述代码会导致错误,因为MY_MACRO展开后变成:

    if (condition)
        a = 1;
    b = 2;
    else
        doSomethingElse();
    

    这显然是不正确的。为避免这种问题,可以使用do { } while (0):

    #define MY_MACRO do { a = 1; b = 2; } while (0)
    

    这样一来,无论在什么上下文中使用宏,都会被视为一个完整的单一语句,不会破坏控制流结构。

  2. 确保语法的一致性:
    使用do { } while (0)可以确保宏在任何地方都可以正确地展开,而不会因为缺少分号或其他控制语句的问题导致语法错误。

示例代码

以下是一个具体示例,展示了如何使用这种技术:

#include <iostream>

#define SAFE_DELETE(ptr)        \
    do {                        \
        if (ptr) {              \
            delete ptr;         \
            ptr = nullptr;      \
        }                       \
    } while (0)

int main() {
    int* myPtr = new int(10);
    SAFE_DELETE(myPtr);

    if (myPtr == nullptr) {
        std::cout << "Pointer successfully deleted and set to nullptr." << std::endl;
    } else {
        std::cout << "Pointer deletion failed." << std::endl;
    }

    return 0;
}

解释

在上面的例子中:

  • SAFE_DELETE宏定义中使用了do { } while (0)。

  • 这确保了宏在任何地方使用时都是一个完整的语句,不会影响其上下文。

  • 例如,在if语句中使用时:

    if (condition)
        SAFE_DELETE(ptr);
    else
        doSomethingElse();
    

    这段代码展开后将是正确的:

    if (condition)
        do {
            if (ptr) {
                delete ptr;
                ptr = nullptr;
            }
        } while (0);
    else
        doSomethingElse();
    

总之,do { } while (0)宏定义结构是C++宏编程中的一个实用技巧,能帮助开发者编写更安全、可靠的宏定义。

NXP应用随记(八):S32K3XX的HSE学习记录(HSE\MU\UTEST\IVT\A,B SWAP) HSE,即硬件安全引擎(Hardware Security Engine),是NXP S32K312微控制器(MCU)中的一个功能,它提供了一系列的安全特性,包括加密、安全启动和密钥存储等。这些功能旨在增强汽车电子系统的信息安全,符合ISO26262标准,达到ASIL D安全等级。具体来说,S32K312的HSE支持AES-128/192/256加密、RSA、ECC等加密算法,以及侧通道保护,确保了数据传输和存储的安全性。 阅读详情

相关推荐

基于stm32开发的红外循迹小车

2.L298N电机驱动模块:分别是5V,12V,GND,可以通过外加电源给驱动模块供电,IN1,IN2,IN3,IN4,EN1,EN2,通过给IN口不同的电平,可以达到控制电机正反转,EN口为使能口,可以通过给EN口不同的PWM波,来达到控制小车速度,1.红外循迹模块:检测黑线的原理是向外发射红外线,当没有遇到黑线的时候,返回回来,之后返回高电平,当遇到黑线的时候,红外被吸收,返回高电平,读取相应IO口的电平就可以知道小车此时的大致位置;模块有四个输入接口,分别连接四个TT马达,驱动小车运动;

2301_81374681的博客 1万+

c++宏的使用和do{}while(0)使用

/返回jj lll,忽略前面后面的空格,每部分字符串缩减为一个空格连接。传入s是什么就是什么,s是变量也会认为就是s,如果s是个宏定义,charArray也会阻止这个宏的展开。号,可以使用do{}while(0)语句进行复杂宏定义,不让他产生;//返回hhh,忽略前面和后面的空格。用处:代替goto,在需要goto的地方使用break直接退出,不执行后面的语句。2.连接后的实际参数名,必须为实际存在的参数名或者是编译器已经知道的宏定义。1.##后面如果是个宏,会阻止宏的展开。3.##会忽略前后的空格。

count8072的博客 612

未来计算的革命:探索存算一体芯片的潜力与挑战

未来计算的革命:探索存算一体芯片的潜力与挑战

jtwqwq的博客 1611

c语言定义宏的时候使用do while

需要注意的是,这个宏的实现可能存在一些问题,例如没有考虑到参数的副作用等情况。因此,在使用宏时需要谨慎考虑其实现方式,以避免潜在的问题。结构的好处是,在使用宏定义时可以像一个独立的语句一样使用,而不会产生语法上的问题。结构来定义宏时,通常是为了确保宏定义中的代码块在使用时可以像一个独立的语句一样被执行。结构本身就是一个语句,因此可以像上面的例子一样使用宏,而不会导致语法错误。结构本质上是一个语句,因此需要使用分号作为结尾,以标识语句的结束。结构也可以避免一些潜在的错误,例如在宏定义中使用。

weixin_45172119的博客 2688

高通camx ThreadManager

m_pCore->AcceptNewJob是将一个Job或者任务插入一个Queue,有一个工作线程循环从Queue中取Job任务执行,执行任务就是回调任务中的callback函数,AcceptNewJob实现。调用AddToPriorityQueue将任务添加到queue任务队列,那么什么时候从这个queue中取任务执行呢?有个线程循环执行DoWork,最终调用checkAndDequeue取任务执行。

GetnextWindow的专栏 435

neruolib全脑建模计算框架

neurolib 是一个用python编写的全脑建模计算框架,也是可扩展的、允许轻松实现自定义神经质量模型,能够在介观尺度上表示脑区平均活动。

Rootfyx的博客 1147

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

在 main 函数中,我们可以像使用单个语句一样使用 MY_MACRO ,并且后续的代码不会受到宏定义中的多条语句的影响。主要的目的是为了解决宏定义在使用时可能引发的一些问题,例如宏定义中的分号和大括号的使用。}while(0),将你的代码写在里面,里面可以定义变量而不用考虑变量名会同函数之前或者之后的重复。,允许在宏定义中使用局部变量。总而言之, do{} while(0) 的作用是为了解决宏定义在使用时可能引发的一些问题,确保宏定义可以作为单个语句使用,并且在逻辑上看起来像是一个语句。

weixin_53592457的博客 2288

手机拍照也能玩高光谱?教你用TensorFlow Lite在Android上实现实时RGB转高光谱

本文介绍了如何利用TensorFlow Lite在Android设备上实现实时RGB到高光谱的图像重构技术。通过深度学习模型优化和移动端部署策略,使智能手机具备专业级光谱分析能力,适用于农业检测、化妆品分析等多个领域。

weixin_29091105的博客 246

c语言精妙之宏(do while)

在linux内核中经常包括以下种类的宏: drivers/block/ataflop.c #define FDC_WRITE(reg,val) \ do { ...

yq272393925的博客 1252

游戏“中台”的故事——架构演进、团队协同与产品创新的深度剖析

什么是中台?在游戏行业里,中台并不是把所有技术都归口管理、统一“圈养”。更不是简单的工具集合。它代表的,是一种“模块化底座”——把业务的通用能力、基础支撑和数据结合,变成可复用、可扩展、可创新的技术体系。让“前台”专注于创新玩法、极致体验;让“后台”稳健保障数据、安全、性能;让“中台”统合各种资源、流程、工具,形成平台型生产力。游戏中台是团队协同、技术创新、业务增长并行的产物。它让开发从重复劳动解脱,带着创新冲锋;让运营靠数据说话,精准制胜;让产品实现高效迭代,生态爆发。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 1949

matlab 受约束的 Delaunay 三角剖分【2025最新版】

matlab内置调用函数实现受约束的 Delaunay 三角剖分并将结果保存为STL文件

点云侠的博客 1875

do...while(); 语句在宏定义中的应用。

首先声明一下do...while语句的原型:(注意最后位置需要一个分号,这个特性带来一些好处) do{ /*循环体*/ } while(condition); 如果你是C++程序员,我有理由相信你用过,或者接触过,至少听说过MFC, 在MFC的afx.h文件里面, 你会发现很多宏定义都是用了do…while(0)或do…while(false), 比如说:#define AFXASS...

mijichui2153的博客 951

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

C/C++的宏定义中使用do{...}while(0)的目的是什么?

首先说明的一点是,这个是百度面试的时候问的一个问题,处于把问题弄透的一个原则,在网络上找了好多资料,其中一个还是比较好的,原文链接:https://www.quora.com/What-is-the-purpose-of-using-do-while-0-in-macros。 Thedo/while(0)pattern seen in many if not most macros in the Linux kernel and elsewhere has a specific purpose: It..

flysky_jay的博客 415

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

C\C++ 使用do{...}while(0)进行宏定义的好处!!!

C\C++语言中,特别是C语言中,有时候出于效率方面的考虑,采用宏的方式来替代函数。C定义宏时,常采用如下方式: #define    MACRO_FUNC(arg)  do{ ...\ }while(0) 为什么要加do{...}while(0)这样看似毫无用处的代码呢?这是为了保证宏方法(function)和普通方法调用方式的统一。eg:   #define MACRO_FUN1(

纯屌丝程序猿 1009

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

关于C语言宏定义 使用do{ xxxx }while()

这样的宏见过么: Cpp代码 #define FOO(x)do{\ some_code_line_1;\ some_code_line_2;\ }while(0) (注意while(0)后面没有分号) 乍一看这个宏不过就是定义了个包含多个语句的local scope,用do..while(0)包围起来简直多此一举。直接这样不就好了么: Cpp代码...

ChenYX的博客 20万+

C/C++宏定义中的do{...} while(0)

C/C++宏定义中do{…} while(0)的用途 今天在pthread_create()的manual中看到了一个#define的函数中使用了do {...} while(0),困惑须臾后通过网络解惑,分享如下:

Dingo 1897

宏定义中的do...while(0)

宏定义中的do...while(0)   如果你是C++程序员,我有理由相信你用过,或者接触过,至少听说过MFC, 在MFC的afx.h文件里面, 你会发现很多宏定义都是用了do...while(0)或do...while(false), 比如说: #define AFXASSUME(cond)       do { bool __afx_condVal=!!(cond); ASSERT(__

沧浪之水 717

C/C++预处理指令和宏定义#define及 do while(0)

本文主要记录了C/C++预处理指令 #define 宏定义 do/while(0) 什么时候使用

一丁的博客 1161

C/C++的奇技淫巧之 do{}while(0)

do{}while(0)()do{}while(0)绝大多数的编译器都能够识别do{…}while(0)这种无用的循环并进行优化,所以使用这种方法并不会导致程序的性能降低。另外,GCC提供了Statement-Expressions用以替代do{…}while(0);所以在GCC中也可以这样定义宏:注意,MSVC不支持这种语义。

u014677109的博客 930

关于do{}while(0)

do…while(0)的用法 这样的宏见过么: Cpp代码: #define FOO(x) do {\ some_code_line_1;\ some_code_line_2;\ } while (0) (注意while(0)后面没有分号) 乍一看这个宏不过就是定义了个包含多个语句的local scope,用do…while(0)包围起来简直多此一举。直接这样不就好了么: Cpp代码: #defi...

qq_42263831的博客 269

do while(0)的作用以及原因

do while(0)的作用以及原因,这是阅读部分源码后体会较深的一个问题。

keep_contact的博客 5325

C++宏中的do{}while(0)

如果你是C++程序员,我有理由相信你用过,或者接触过,至少听说过MFC, 在MFC的afx.h文件里面, 你会发现很多宏定义都是用了do...while(0)或do...while(false), 比如说: #define AFXASSUME(cond) do { bool __afx_condVal=!!(cond); ASSERT(__afx_condVal); __analysis_assu...

lihaidong的博客 465

do{}while(0)的用法

C/C++中do{ … }while(0)的用法:1. 解决宏的歧义;2. 统一代码出口

凡辰道 1042

为什么包含多句代码的宏要用do while包括起来?

为了看起来更清晰,这里用一个简单点的宏来演示:#define SAFE_DELETE(p) do{ delete p; p = NULL} while(0)假设这里去掉do...while(0),#define SAFE_DELETE(p) delete p; p = NULL;那么以下代码:if(NULL != p) SAFE_DELETE(p)else ...do sth...就有两个...

weixin_30628077的博客 85

do{}while(0)的妙用

do...while(0)的妙用 在C++中,有三种类型的循环语句:for, while, 和do...while, 但是在一般应用中作循环时, 我们可能用for和while要多一些,do...while相对不受重视。 但是,最近在读我们项目的代码时,却发现了do...while的一些十分聪明的用法,不是用来做循环,而是用作其他来提高代码的健壮性。 1. do...while

铸剑娃的专栏 3504
上一篇: C++中仿函数和普通函数进行谓词操作各自的优缺点
某k君
博客等级 码龄7年 39粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值