在Lwip中,会经常看到宏定义do{...}while(0)的结构。如上示例可以看出,使用宏替换多条语句的编写,会方便的多。但是,为什么要使用do{...}while(0)这样的结构形式呢?答:使用do{...}while(0)构造后的宏定义,可避免大括号、分号等的影响。有点难以理解是吗?看一个例子消化一下。(一)不用do{...}while(0...
#define CUBE(a, b) \ do { \ a = a * a * a; \ b = b * b * b; \ } while (0) 注意: 并不是所有的含有多条语句的宏定义都可以直接加do-while(0)结构 在含有break,goto等跳转语句的宏定义中一定要厘清代码的逻辑 如果加了do-while(0)有可能会改变代码逻辑 甚至会出现无法跳转出去的情况...
在Linux内核中,经常会看到do{} while(0)这样的语句,许多人开始都会疑惑,认为do{} while(0)毫无意义,因为它只会执行一次,加不加do{} while(0)效果是完全一样的,其实do {}while(0)的用法主要用于宏定义中。 这里用一个简单的宏来演示: #defineSAFE_FREE(p)do{free(p);p=NULL;}while(0) 假设这里去掉...
适应性:使用do{...}while(0)比直接定义语句(...),或者直接用大括号包裹语言({...})更安全; 扩展性:使用do{...}while(0)可以引用其他的宏; 灵活性:可以从宏中break出来
// 注意宏定义里的do{}while(0)语句是故意不打分号,这样在主程序调用宏时,可以很好配合宏后面跟着的分号. // 宏定义中不要在do{}while(0)语句后面加分号写成了 do{}while(0); 这样就没有防出错效果了 #define SWITCH(a, b) \ do { \
宏定义中使用do-while(0)的目的是确保宏能被完整执行。C语言中的宏,本质上是对代码的简单替换。对于含有多条语句的宏定义,不使用do-while(0)可能导致宏展开错误。错误示例1:当宏定义没有使用大括号{}、if(0){}或do-while(0),若在调用宏时条件不满足,宏展开后的代码仍然执行所有语句,如“...
} while (0) 采用这种方法,可以准确地确保语句被完整执行,目前笔者还没想到有哪些情况会使其出现问题。 另外,由于do { ... } while(0) 中的语句被花括号包含,所以会形成一个块,一个作用域。这时可以在花括号里的最前面声明变量,变量的生命周期就是花括号的范围。另外,加上do{...}while(0),可以阻止宏作...
使用do{}while(0)包裹代码 尽管C语言中的“函数式宏定义”和真正的函数相比有一些缺点,但只要小心使用还是会显著提高代码的执行效率的,毕竟省去了分配和释放栈帧、传参、传返回值等一系列工作。正因为如此,Linux 内核中有相当多的方法是使用 define 宏定义实现的,并且,在内核C语言代码中,“函数式宏定义”经常借...
C语言宏定义使用do{}while(0)的好处1. 概述 经常写项目代码,有时需要用到宏定义,而宏定义的用法是否标准,则是会影响到是否能快速查错以及代码拓展性的问题。在宏定义的用法上大家为什么都推荐用do{}while(0)这种用法呢?主要有两点原因,一个是代码适应性以及拓展性,第二个是为了尽量避免一些不必要的语法和逻辑...
0 922 do{...}while(0)的妙用 2019-04-24 20:35 −1.帮助定义复杂的宏以避免错误 举例来说,假设你需要定义这样一个宏: #define DOSOMETHING() foo1(); foo2(); 这个宏的本意是,当调用DOSOMETHING()时,函数foo1()和foo2()都会被调用。但是如果你在调用的时候这么写: if(a>0... ...