- 为啥内核里有这么多 do{ }while(0) 的宏啊?一开始我也好不明白。感觉不出用了会有什么效果。不过明白之后就知道它的好处了。好处就在于多语句的宏。
- #define FOO(x) print(”arg is %sn”,x);do_something(x);
- 在代码中使用:
- if(2==blah)
- FOO(blah);
- 预编译展开后:
- if(2==blah)
- print(”arg is %sn”,blah);
- do_something(blah);
- 看到了吧,do_something函数已经脱离了if语句的控制了。这可不是我们想要的。使用do{}while(0);就万无一失了。
- if (2== blah)
- do {
- printf(”arg is %sn”, blah);
- do_something(blah);
- } while (0);
- 当然你也可以使用下面这种形式:
- #define exch(x,y) { int tmp; tmp=x; x=y; y=tmp; }
- 但是它在if-else语句中会出现问题。如:
- if (x > y)
- exch(x,y); // Branch 1
- else
- do_something(); // Branch 2
- 展开后:
- if (x > y) { // Single-branch if-statement!!!
- int tmp; // The one and only branch consists
- tmp = x; // of the block.
- x = y;
- y = tmp;v}; // empty statementelse
- // ERROR!!! “parse error before else”do_something();
- 看到了吧,else成了语法错误了。使用do{}while(0)就不会有这个问题了。
- if (x > y)
- do {
- int tmp;
- tmp = x;
- x = y;
- y = tmp;
- } while(0);
- else
- do_something();
- 嗯,现在明白之后,自己的代码也记得用啊!
相关推荐
电流互感器的使用分析
有关电流互感器使用的注意事项,回头再看,耳目一新。
宏定义代码块之 do{} while(0) 的使用
在 main 函数中,我们可以像使用单个语句一样使用 MY_MACRO ,并且后续的代码不会受到宏定义中的多条语句的影响。主要的目的是为了解决宏定义在使用时可能引发的一些问题,例如宏定义中的分号和大括号的使用。}while(0),将你的代码写在里面,里面可以定义变量而不用考虑变量名会同函数之前或者之后的重复。,允许在宏定义中使用局部变量。总而言之, do{} while(0) 的作用是为了解决宏定义在使用时可能引发的一些问题,确保宏定义可以作为单个语句使用,并且在逻辑上看起来像是一个语句。
保姆级教学:从0搭建微信小程序SpringBoot+Vue(一)
目标:实现一个微信小程序从后端数据库MySQL获取的商品展示页。 框架:后端采用SpringBoot,前端采用Vue,数据库MySQL。 部署工具:IntelliJ IDEA 2024.2专业版+HbuilderX+Node+微信开发者工具,jdk1.8已安装
c语言定义宏的时候使用do while
需要注意的是,这个宏的实现可能存在一些问题,例如没有考虑到参数的副作用等情况。因此,在使用宏时需要谨慎考虑其实现方式,以避免潜在的问题。结构的好处是,在使用宏定义时可以像一个独立的语句一样使用,而不会产生语法上的问题。结构来定义宏时,通常是为了确保宏定义中的代码块在使用时可以像一个独立的语句一样被执行。结构本身就是一个语句,因此可以像上面的例子一样使用宏,而不会导致语法错误。结构本质上是一个语句,因此需要使用分号作为结尾,以标识语句的结束。结构也可以避免一些潜在的错误,例如在宏定义中使用。
龙头复盘神器/复盘于导出工具最新版5.6
龙头复盘神器,复盘于导出工具
Spring Boot与Apache Ignite集成:构建高性能分布式缓存和计算平台
Apache Ignite是一个高性能的分布式内存计算平台,支持内存缓存、分布式计算、流处理和机器学习等功能。它提供了低延迟的数据访问和强大的计算能力,适用于需要高性能和可扩展性的应用。将Apache Ignite集成到Spring Boot应用中,可以显著提高应用的性能和可扩展性。Spring Boot的简单配置和Ignite的强大功能相结合,使得开发和部署更加高效。首先,创建一个新的Spring Boot项目。可以通过Spring Initializr(https://start.spring.io/)
c语言精妙之宏(do while)
在linux内核中经常包括以下种类的宏: drivers/block/ataflop.c #define FDC_WRITE(reg,val) \ do { ...
ZYNQ系列PS侧和PL侧DDR3或DDR4在AD(Altium Designer 25)中的layout布线规则约束
DDR3或DDR4的PCB布线规则通常有相对固定的要求,对应的,在PCB设计时有固定的约束设置。
c++中使用do { } while (0)宏定义
在C++中,使用宏定义是一种常见的技巧,用于创建类似函数的宏。这种宏结构可以避免许多常见的宏定义问题,如意外的行为或语法错误。
中国各城市土地利用类型(城市功能)数据集(shp)
中国各城市土地利用类型(城市功能)数据集时间:2018年全国范围的城市用地类型数据(居住/商业/交通用地等共计11类)分类:居住用地、商业用地、工业用地、医疗设施用地、体育文化设施用地、交通场站用地、绿地等用地类型含城市编码、一级分类5个、二级分类11个1、上海市。
使用modelscope加载报错:ImportError: cannot import name ‘AutoTokenizer’ from ‘modelscope’...如何解决?| 提供多种解决方案
🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!
c++宏的使用和do{}while(0)使用
/返回jj lll,忽略前面后面的空格,每部分字符串缩减为一个空格连接。传入s是什么就是什么,s是变量也会认为就是s,如果s是个宏定义,charArray也会阻止这个宏的展开。号,可以使用do{}while(0)语句进行复杂宏定义,不让他产生;//返回hhh,忽略前面和后面的空格。用处:代替goto,在需要goto的地方使用break直接退出,不执行后面的语句。2.连接后的实际参数名,必须为实际存在的参数名或者是编译器已经知道的宏定义。1.##后面如果是个宏,会阻止宏的展开。3.##会忽略前后的空格。
商用车重型多挡位机械式变速器(AMT)结构设计与仿真分析
本文针对商用车重型AMT变速器开展结构设计与仿真分析。设计采用12挡双中间轴结构,匹配400kW柴油发动机,最大扭矩2000Nm。通过等比级数分配传动比(头挡14.5,最高挡0.78),采用主副箱组合实现多挡位。双中间轴结构可抵消径向力,提升承载能力。关键设计包括:235mm中心距、4.5-5.0mm齿轮模数、锁环式同步器和复合润滑系统。通过Python参数化建模进行强度校核,计算显示中间轴在2000Nm工况下等效应力满足安全系数要求(屈服强度850MPa,安全系数≥2)。该设计解决了传统MT变速器操作强度
do{...}while(0)的用法
do{...}while(0) 的妙用 1.导引: 第一次见到 do{...}while(0)是在学习libevent的时候,看到里面有很多类似 #define TT_URI(want) do { \ char *ret = evhttp_uri_join(uri, url_tmp, sizeof(url_tmp)); \ tt_want(ret != NULL);
Devexpress16.2.6破解工具
Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具
VC中sqlite的使用
在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示
do while(0)的作用以及原因
do while(0)的作用以及原因,这是阅读部分源码后体会较深的一个问题。
数学建模模型总结
这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!
do{...}while(0)的作用
我们都知道,在程序中如果一些常量参数或者代码语句反复出现,就可以使用宏定义来替代。预处理阶段,对程序中所有出现的“宏名”,预处理器都会用宏定义中的字符串替代,这称为“宏替换”或“宏展开”。这样做可提高程序的通用性和易读性,减少不一致性,一个较好的宏名可以更好的让读者理解常量参数的含义;同时程序易于修改,我们仅需要改变一个宏定义,就可以改变整个程序中出现的所有该常量或者语句。但是有时可能程序代码段中,出现多条语句重复连续的使用,这样我们就可以尝试使用一个复杂的宏来替换。你有可能会这样定义:funB()
android 蓝牙通讯demo
android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。
do{}while(0)用法
linux内核和其他一些开源的代码中,经常会遇到这样的代码: do{ ... }while(0) 这样的代码一看就不是一个循环,do..while表面上在这里一点意义都没有,那么为什么要这么用呢? 实际上,do{...}while(0)的作用远大于美化你的代码。查了些资料,总结起来这样写主要有以下几点好处: 1、辅助定义复杂的宏,避免引用的时候出错: 举例来说,假设你需要定义这样一个...
while及do while语句
编写程序时,许多问题都要用到循环控制。循环结构也是结构化程序设计的基本结构之一,因此熟练地掌握循环结构是程序设计最基本的要求。While循环、do while循环、for循环语句,3种循环语句在一般情况下可以相互转换 While 及dowhile语句 While语句和do while语句都是C语言中循环结构的一种实现方式。While语句实现当型循环结构;do while语句较while语句在执行和...
代码使用do...while(0)的好处
do{...}while(0)的妙用
你想知道的do{...}while(0)的作用,都在这里了
Java do...while{}
C/C++ 宏中 `do { ... } while (0)` 的“零次循环”技巧
的惯用法,确保宏在任何上下文中表现如一条普通语句。
do-while(0)语句到底有什么用?
do-while(0)语句到底有什么用?
C/C++宏定义中do{}while(0)的妙用
摘要: do{}while(0)是C/C++中一种特殊编程技巧,主要用于宏定义和代码块封装。其核心价值包括: 宏安全性:确保多语句宏在条件语句中展开时语法正确,强制分号结尾,避免if-else断裂问题; 错误处理:替代goto实现结构化资源清理,通过break跳转和集中式回收简化多步骤操作的错误处理; 作用域隔离:创建临时块级作用域,限制变量生命周期,避免命名冲突; 代码一致性:保持与函数调用相同的分号习惯,提升可维护性。该技巧在宏定义、嵌套错误处理及资源管理中具有不可替代的优势。
【C语言高级技巧】用 do { } while(0) 包装宏
所以,博主建议,在有大量宏定义的项目中,使用该语句对宏进行封装,让宏表现得像一个“单一语句”,可以安全地放在任何地方使用。在C语言中,宏是预处理器提供的一种文本替换机制,虽然非常灵活,但也容易带来一些令人头疼的问题,尤其是在多语句宏的使用中。这在语义上是危险的,因为if只控制了statement1,而statement2会无条件执行,这极易引发逻辑错误。这段代码即使加了分号、即使在各种控制语句下使用,也总是表现得像一个标准的单个语句块,不会有歧义。是C语言预处理器提供的内置宏,表示当前代码所在的行号。
C语言do...while(0)使用小结
引言 在一些C语言程序中我们会看到do...while(0);这样的语句,这样的用法貌似画蛇添足,实际却颇有妙用。单独来看,do…while(0)和顺序执行`...部分的代码的效果并无二致,然而在如下两种情况下的效果却十分巧妙。 一.宏定义中实现局部作用域 我们知道宏定义只是做一个标识符和字符串的替换,尽管宏定义的形式可以类似于函数,但是它实际并不具备与函数类似的局部作用域。当然了,我们可以...
do while(0)的作用
在嵌入式开发的过程中,我们经常可以看到在一些优秀开源代码的头文件里发现一些宏定义使用了do{}while(0)语句,也许你会疑惑do{}while(0)不就是只执行一次吗,为什么还要多此一举使用循环结构去包裹。实际上,do{}while(0)的作用很大,下面可以看几个例子。 一、定义复杂宏避免逻辑或编译错误 假如你定义了一个宏,这个宏的作用为连续调用2个函数,宏定义如下: #define ...
2万+



被折叠的 条评论
为什么被折叠?



