(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)的使用完全是为了保证宏定义的使用者能在不出现编译错误的情况下使用宏,它不对其使用者做任何假设。
1、多于一条语句的宏: 当C语言中的宏定义包含了多余一条语句时,如下面这种情况: #define M() a(); b() 如果后面的程序需要使用这个定义的宏M(),则可能产生错误。 2、错误演示: #define M() a(); b() if (cond) M(); else c(); /* 预
1.1 没有使用do{...}while(0) 下面的宏定义没有使用do{...}while(0) #defineFOO(x)foo(x);bar(x); 这样宏定义,单独调用不会出现问题,例如: FOO(100) 宏扩展后变成: foo(x);bar(x); 1.2 if...else中使用宏时的编译错误 上面调用FOO没有任何问题,但是FOO(x)不能放入控制语句中,例如 ...
被do {...} while(0) 包裹的宏函数 乍一看感觉有些多余,为什么要在宏定义中套一个 do {...} while(0)? 答案:使用 do {...} while(0) 构造后的宏定义,可避免大括号、分号等的影响 举个例子👏: 不用do {...} while(0) 结构进行宏函数定义将带来如下影响: ...
宏定义中使用do-while(0)的目的是确保宏能被完整执行。C语言中的宏,本质上是对代码的简单替换。对于含有多条语句的宏定义,不使用do-while(0)可能导致宏展开错误。错误示例1:当宏定义没有使用大括号{}、if(0){}或do-while(0),若在调用宏时条件不满足,宏展开后的代码仍然执行所有语句,如“...
另外,由于do { ... } while(0) 中的语句被花括号包含,所以会形成一个块,一个作用域。这时可以在花括号里的最前面声明变量,变量的生命周期就是花括号的范围。另外,加上do{...}while(0),可以阻止宏作为表达式使用。 如果没有 do while ,那么语句可能会被部分地执行,如 ...
使用do{}while(0)包裹代码 尽管C语言中的“函数式宏定义”和真正的函数相比有一些缺点,但只要小心使用还是会显著提高代码的执行效率的,毕竟省去了分配和释放栈帧、传参、传返回值等一系列工作。正因为如此,Linux 内核中有相当多的方法是使用 define 宏定义实现的,并且,在内核C语言代码中,“函数式宏定义”经常借...
C语言宏定义使用do{}while(0)的好处1. 概述 经常写项目代码,有时需要用到宏定义,而宏定义的用法是否标准,则是会影响到是否能快速查错以及代码拓展性的问题。在宏定义的用法上大家为什么都推荐用do{}while(0)这种用法呢?主要有两点原因,一个是代码适应性以及拓展性,第二个是为了尽量避免一些不必要的语法和逻辑...