宏函数为什么使用do{...}while{0}包起来

在宏定义中使用 do...while 这两天在看别人代码时,发现别人在宏定义中使用了do...while语句,百思不得其解,于是在网上查找了一番,现总结了一下,转帖出来共享!#define MACRO_NAME(para) do{macro content}while(0)的格式,总结了以下几个原因:1,空的宏定义避免warning:      #define foo() do{}while(0) 2,存在一个 阅读详情

在我们看内核源码或者库以及一些优秀的源码时,都会发现他们的宏函数是包括在do{…}while(0)内。具体的原因其实想想就能明白。

考虑下面一个特殊的例子。
宏函数的定义如下:

#define test(x) \
  a(x); \
  b(x);

如果在调用时是这样调用的:

if (judge)
  test(x);

那么展开之后就是:

if (judge):
  a(x);
b(x);

这时产生的效果可能就和你的本意不同了,因为b(x)无论怎样都会执行。

这是由于大括号产生的问题,那如果我们简单的给宏函数加上大括号而不用do{…}while(0)可以吗?
举例如下:

#define test(x)\
{ \
  a(x);\
  b(x);\
}

调用时:

if (judge)
  test(x);

展开之后:

if (judge)
{
  a(x);
  b(x);
};

这个时候就产生语法错误了,因为多了一个分号。

总结:宏函数加do{…}while(0)其实并不是额外加了什么功能,只是为了保持宏函数实现的时候语意和我们所写的代码一致,防止大括号以及分号的干扰。

加密算法:深度解析Ed25519原理 在 Solana 开发过程中,我一直对 Ed25519 加密算法 如何生成公钥、签名以及验证签名的机制感到困惑。为了弄清这一点,我查阅了大量相关资料,终于对其流程有了更清晰的理解。在此记录实现过程,方便日后查阅。 阅读详情

相关推荐

pytest-bdd封装

简介 pytestbdd主要是用于代码封装 代码封装的好处: 1、提升代码复用率 2、提示测试效率 手工测试–使用框架0代码 流程+数据驱动 产品经理这样的不懂测试的人员–流程驱动 自动化测试–数据驱动 pytest-bdd:流程驱动封装 行为驱动–敏捷开发模式,消除开发/测试对需要了解的歧义 使用方式: 描述需求/用户场景 Feature(需求) Scenario(场景) Given(假设) When(操作步骤) Then(验证,清除) #新建feature 文件之前 需要提取安装支持featrue文.

liao_11的博客 2733

宏定义追加do{ }while(0)的原因

代码里面经常遇见宏定义里面追加   do{   } while(0);的情况 查了下资料总结了一下,认为主要原因有两个 1:防止空定义宏,代码编译不过。 2:防止二义 例: #define   NS_FUNC()     func1(); \ func 2(); 上面函数在执行以下处理的时候 。会出错,错误明显,func 2()必然执行~ if (exp)

一个码农的博客 513

STM32CubeIDE串口打印浮点数踩坑实录:5分钟搞定printf输出小数(附完整配置截图)

本文针对STM32CubeIDE中串口无法打印浮点数的常见问题,提供了详细的解决方案。核心在于通过添加“-u _printf_float”链接器参数,启用标准库的浮点数格式化支持。文章附有完整的配置截图和步骤,并提供了系统性的排查清单,帮助开发者快速解决printf输出小数的问题。

weixin_29163797的博客 343

为什么要在宏中使用 do{...}while(0) (转)

如果你是一名C程序员,你肯定很熟悉宏,它们非常强大,如果正确使用可以让你的工作事半功倍。然而,如果你在定义宏时很随意没有认真检查,那么它们可能使你发狂,浪费N多时间。在很多的C程序中,你可能会看到许多看起来不是那么直接的较特殊的宏定义。下面就是一个例子: #define __set_task_state(tsk, state_value) \ do{ (tsk)->st

博客 1025

【四足机器人项目实战】MIT无刷电机FOC硬件电路设计

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录系列文章目录前言一、MCU最小系统--STM32F446RE1.usb串口通讯连接口+程序下载连接口2.MCU电源滤波二、磁编码器角度传感器三、三相驱动桥四、CAN通讯收发器电路五、温度ADC检测六、电源滤波及分压电路1、DC电源输入端2、DC电源滤波电路3、DC电源分压电路4、三相绕线接线端总结参考资料 前言 认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长! 本文先对

qq_35635374的博客 7061

120、NPU的Mythic M1076:模拟存算一体NPU

这篇文章分享了作者调试Mythic M1076模拟存算一体NPU的实战经验,主要包含以下要点: 硬件设计陷阱:参考电压输入必须使用低ESR电容,普通贴片电容会导致模拟计算阵列工作异常。 核心技术原理: 采用真正的存算一体架构,将权重存储为模拟电压 使用浮栅晶体管存储权重,通过电流叠加实现乘法运算 包含108个计算单元阵列(Tile),每个256×256规模 使用注意事项: 编程模型特殊,需要依赖SDK自动映射网络层 存在6-8位有效精度限制,需用量化感知训练 功耗特性独特,静态偏置电流占主要功耗 调试手段有

m0_50546716的博客 122

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

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

weixin_53592457的博客 2288

SAP_FI模块_固定资产期初导入全流程(含导入代码)

SAP 期初导入资产主数据以及金额相关的操作全流程记录,包含了批导程序的代码,以及错误记录

风沙的博客 1404

宏定义时为什么建议使用do{}while(0)

使用结构可以确保宏展开的结果是一个完整的语句,即使在宏被用作更大的表达式的一部分时也是如此。这有助于避免意外的行为,并使得宏的使用更加安全和易于理解。

weixin_43212200的博客 546

产品需求从场景,初始需求IR,产品需求 OR,设计需求DR,设计规格DS的具体案例说明,以扫地机产品为例

摘要: 以扫地机器人"宠物粪便避障"功能为例,说明从用户场景到产品落地的完整需求转化路径。初始需求(IR)源于养宠家庭痛点,要求100%避障并自动告警;产品需求(OR)转化为≥98%识别准确率等量化指标;设计需求(DR)拆解为感知、决策、执行三大技术模块;最终形成传感器选型(如索尼IMX678)、芯片规格(高通QCS6490)等设计规格(DS)。通过实验室模拟和用户测试验证,该功能使产品溢价30%,养宠家庭购买占比达52%,实现技术与商业价值的统一。

AIoT深度探索者 | 嵌入式系统架构师 深耕物联网(IoT)与人工智能(AI)融合技术,聚焦​​边缘计算、图像开发、低功耗通信协议​​,致力于智能硬件,关注我获取最新技术文章信息与海量资源~ 766

【补充篇】三万字了解AUTOSAR软件架构(一)

主要讲解了AUTOSAR软件架构的分层及各个栈的作用

weixin_47571898的博客 1117

宏定义中使用do{}while(0)的好处

#define MACRO_NAME(para) do{macro content}while(0)的格式,总结了以下几个原因:1,空的宏定义避免warning:#define foo() do{}while(0)2,存在一个独立的block,可以用来进行变量定义,进行比较复杂的实现。3,如果出现在判断语句过后的宏,这样可以保证作为一个整体来是实现:#define foo(

liliangbao的专栏 2万+

【GameFramework框架内置模块】8、文件系统(File System)

最近好忙,鸽了好久。不能颓废了,继续发力。今天分享的是GF框架的文件系统。首先,引用比较官方的说法:GF的FileSystem虚拟文件系统,使用类似磁盘存储的感念对零散的文件进行集中管理,优化资源加载时产生的内存分配,也可以对资源进行局部片段加载,极大的提升了资源加载的性能。通俗点讲就是,我这个模块就是加载磁盘文件的,优化加载时产生的内存分配。那么,它是怎么优化的呢?

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 2452

C语言带返回值的宏,宏函数使用{}与do{}while(0)的区别

宏函数是在编译时进行文本替换,这样可以提高代码的执行效率,普遍用于调用比较频繁的代码段。但是需要注意一些细节。

⭐小星星的博客⭐ 3448

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

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

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

宏函数以及do{...}while(0)的巧妙用法

宏定义,编译预处理命令,在编译预处理时即进行简单的字符串替换。 宏定义函数和用户定义的函数在使用时有如下区别: 1、宏函数会在编译预处理时展开,只占用编译时间,函数调用则会占用运行时间(分配单元、保存现场、值传递、返回等),每次执行都需要载入,所以执行相对于宏较慢。 2、在函数调用时,先求出实参表达式的值,然后带入形参。而使用带参的宏只是进行简单的字符替换。 3、函数调用是在程序运行时处理的,分配...

weixin_39936714的博客 1717

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

do-while(0)语句到底有什么用?

do-while(0)语句到底有什么用?

在嵌入式嵌入式领域奋斗的程序猿的博客 3191

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

do while(0)的妙用

do while(0)的妙用 do while(0);就如同一个花括号,具有独立的作用域,花括号所表示的符合语句是一个整体,do while(); 语句同样是一个整体,同样可以在if 等条件语句后直接使用。但是后所不同的是,do while(); 作为循环语句还可以使用break 跳出循环,程序执行流也就随之来到了do while(0);的下一条语句。下面就来介绍 do while(0);的三条...

Hello_MyDream的博客 3万+

C++中do...while(false)妙用

C++中do…while(false)妙用 C++中,循环逻辑有三种格式:for,while以及do...while();,前两种是比较常用的,循环逻辑也很直观,但是do...while()循环一般比较少见,它其实更多地是用在宏函数定义和代码结构优化中,具体看下面代码: 用在宏函数中 加入需要定义一个释放内存的宏函数,如下: #define SAFE_DELETE(ptr)

柚子树's Blog 1636

Python 为什么不设计 do-while 循环结构?

在某些编程语言中,例如 C/C++、C#、PHP、Java、JavaScript 等等,do-while 是一种基本的循环结构。它的核心语义是:先执行一遍循环体代码,然后执行一遍条件语句,若条件语句判断为真,则继续执行循环体代码,并再次执行条件语句;直到条件语句判断为假,则跳出循环结构。流程图如下(Java 示例)://打印小于20的数字 publicclass...

cainiao_python的博客 2285

【jvm】do while(0) 为啥被用在宏定义中

1 实例源码 openjdk/jdk/src/solaris/native/java/io/io_util_md.h:95 /* * Retry the operation if it is interrupted */ #define RESTARTABLE(_cmd, _result) do { \ do { \ _result = _cmd; \ } while((_result == -1) && (errno == EINTR)); \ }

qfzhangwei的专栏 386

C/C++为什么要专门设计个do…while?

最初do ... while的出现,更多的是作为循环控制流的一种语法糖。因为不论是while 还是 for循环,都是要先判断是否满足进入循环体的条件的。满足条件之后才能进入循环去执行循环体内的操作。 文章转载自:微信公众号:编程往事,作者:果冻虾仁 而有些时候,第一次的执行逻辑我们不需要满足循环条件,也要执行。这时候就可以用do ... while。举个例子,前几天的LeetCode每日一题869. 重新排序得到2的幂,刚好遇到这么一个场景: 给定正整数 N ,我们按任何顺序(包括原始顺序)将数

致力于C语言C++知识分享! 309

【嵌入式C语言】--do{…}while(0)的学习

文章参考:(1条消息) C语言 -- do{…}while(0)的意义和用法_诸葛一帆丶的博客-优快云博客 在学习STM32H743的代码过程中,经常碰到一些有关do{...}while(0)的宏定义。 如,在学习stm32h7xx_hal_rcc.h文件时,就有相关的宏定义: #define __HAL_RCC_GPIOA_CLK_ENABLE() do { \ ...

xk554584023的博客 863

从Redis 8.4.0源码看快速排序(1) 宏函数min和swapcode

本文分析min和swapcode宏函数的设计。该宏函数采用类似模板的方式实现类型安全的数组元素交换,通过(n)/sizeof(TYPE)计算交换次数,使用do-while循环完成批量交换。特别指出宏函数外层花括号的必要性,它能避免变量名冲突。文章还通过测试代码演示了swapcode的实际应用,并对比了预处理前后的代码差异。最后讨论了do-while(0)在宏定义中的作用,通过示例说明其能有效解决悬垂else问题,是编写复杂宏函数的良好实践。

zhangcoder的博客 记录学习轨迹~ 1349

c语言do while的好处,do{}while(0)宏定义的好处

通过do-while(0)宏定义将代码打包起来,成为一个独立的语法单元,从而不会引起上下文混淆,同时因为绝大多数的编译器都能够识别do{…}while(0)这种无用的循环并进行优化,所以使用这种方法也不会导致程序的性能降低下面就举几个上下文混淆的例子来说明do-while(0)的好处例1先看一个简单的宏#define SAFE_FREE(p) do {free(p);p=NULL;} while(...

weixin_29327977的博客 619

C 语言宏函数:带参数宏的语法规则、优先级问题与do-while(0)包装技巧

带参数宏在 C 语言中非常有用,但必须遵守语法规则:用括号包围参数和表达式以避免优先级问题(如 $ a + b \times c $ 的意外计算),并使用 do-while(0) 技巧处理多语句宏,确保在控制结构中安全。始终添加括号防御优先级问题。对多语句宏使用 do-while(0) 包装。测试宏展开(如用gcc -E预处理),验证行为。通过这些技巧,您可以高效利用宏函数,提升代码质量和可维护性。如果有具体代码示例,我可以进一步分析!

2501_93893039的博客 309
上一篇: 深入dup2的内部细节
下一篇: static关键字在C/C++中的作用(详解)
UKey_
博客等级 码龄10年 258粉丝 186原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值