(2)使用 do-while 结构也可以避免一些潜在的错误,例如在宏定义中使用 if 和 else 结构时可能会产生错误的语法解析。 (3)需要注意的是,do-while 结构中的循环条件始终为 false(0),因此代码块只会被执行一次。 (4)让程序更加美观,由于 do-while 结构本质上是一个语句,因此需要使用分号作为结尾,以标识语句的结...
答:使用do{...}while(0)构造后的宏定义,可避免大括号、分号等的影响。有点难以理解是吗?看一个例子消化一下。(一)不用do{...}while(0)结构进行宏定义带来的影响 示例:定义宏Get_OptResult(a, b, c, d)精简代码c = ((a) + (b));和d = ((a) * (b));,如下所示: #include <stdio.h> ...
假设用了do {} while(0),情况就不一样了,同样的代码会被展开为: if(NULL!=p) do{free(p);p=NULL;}while(0); else .../*dosomething*/ 不会再出现编译问题。do while(0)的使用完全是为了保证宏定义的使用者能在不出现编译错误的情况下使用宏,它不对其使用者做任何假设。
// 注意宏定义里的do{}while(0)语句是故意不打分号,这样在主程序调用宏时,可以很好配合宏后面跟着的分号. // 宏定义中不要在do{}while(0)语句后面加分号写成了 do{}while(0); 这样就没有防出错效果了 #define SWITCH(a, b) \ do { \ temp = a; \ a = b; \ b = temp; \ } while(0) \...
使用do { ... } while(0)这种写法在宏定义中有几个好处: 语句块的一致性:在宏中使用do { ... } while(0)可以确保在宏展开时总是生成一个完整的语句块。这意味着即使宏被用在需要单个语句的上下文中,也不会导致语法错误。 条件判断的安全性:如果宏的条件部分(如if语句)后面紧跟着一个分号,那么在宏展开...
#defineFOO(x) do{OTHER_FOO(x);}while(0) 这样我们不用管OTHER_FOO是但语句还是符合语句,都不会出现问题 3.增加代码的灵活性 3.1 提前从宏中break 灵活性主要体现在,我们可以从宏中break出来,例如下面的定义: #defineFOO(x) do{ \foo(x); \if(condition(x)) \ ...
答案:使用 do {...} while(0) 构造后的宏定义,可避免大括号、分号等的影响 举个例子👏: 不用do {...} while(0) 结构进行宏函数定义将带来如下影响: 未被do {...} while(0) 包裹的宏函数 一旦将宏函数放入 do {...} while(0) 中进行定义显然就消除了上述影响,又学到一招 😄 ...
为什么在内核中碰到很多 #define ... do{...} while(0) ? 有以下几点原因: 1、空语句在编译的时候会出现警告,所以有必要用#define FOO do{ } while(0) 2、给定一个基本块,可以在里面定义局部变量 3、为了能够在条件语句中使用复杂的宏定义。例如下面这段代码: ...
宏定义中使用do-while(0)的目的是确保宏能被完整执行。C语言中的宏,本质上是对代码的简单替换。对于含有多条语句的宏定义,不使用do-while(0)可能导致宏展开错误。错误示例1:当宏定义没有使用大括号{}、if(0){}或do-while(0),若在调用宏时条件不满足,宏展开后的代码仍然执行所有语句,如“...
在查看 FreeBSD 和 linux 系统代码时,不难发现其中会出现很多的宏定义,它们中包含了多条语句。为确保语句被完整执行,会使用 do { ... } while(0) 来包含所有要执行的语句。如: #define MYPRINT(a, b) \ do { \ printf(#a " = %d\n", (a)); \ ...