#define 和 do{...}while(0) 的妙用
程序员文章站
2022-03-15 22:43:48
...
正确理解宏定义的妙用
最近在阅读公司代码的时候发现宏定义 #define 后面的语句都是被 do{…}while(0); 圈起来的。作为一个还没毕业的实习生,对此很是不解。
正确认识宏定义#define
#define是在预处理的时候进行直接替换
这个是重点!
举例:
#define func(x) x*10-2
int res = 4*func(3);
res 的结果是多少? 算一下。结果应该是 118 。千万别算成 112 。
仔细理解一下上面黄色字体的内容,很好理解的。
如果定义的是一个函数会怎么样;
void print1() {
printf("Hello 1");
}
void print2() {
printf("Hello 2");
}
#define func() print1();print2();
int main() {
if (0)
func();
return 0;
}
会不会有输出?
答案是有的。 再到前面看一下黄色字体,#define是在预处理的时候进行直接替换。
是不是理解了,会输出 hello 2
对的,#define 在编译的时候会被直接替换。
当然如果main 函数里面这么写就没错了。
int main() {
if (0) {
func();
}
return 0;
}
这样符合我们的逻辑。
do{…}while(0) 的妙用
但是在公司一个大项目中,对于几十上百万行的代码,我们很难去管理上面的错误。可能一个项目会有多个人参与,好多人维护,如果把经历花费在维护这样的事情上当然很不值得,因此 do{...}while(0);
的,妙用就体现出来了。
我们可以自己待到上面的例子看看:
void print1() {
printf("Hello 1");
}
void print2() {
printf("Hello 2");
}
#define func() \
do { \
print1();print2(); \
} while(0)
int main() {
if (0)
func();
return 0;
}
编译后main函数是这样的:
int main() {
if (0)
do {
print1();print2();
} while(0);
return 0;
这样就不会出现编译错误。
推荐阅读
-
for,while,do....while,三大循环结构的用法和对比!
-
Go 中 while 和 do..while 的实现
-
循环结构:while、do-while、for循环,break和continue在循环中的用法
-
程序员应了解的那些事(21)do{...}while(0)的意义
-
C语言中do...while(0)的妙用-避免goto
-
详解Java中while和do-while循环、break的使用
-
利用do while 循环和 switch 分支语句做一个简易的ATM机
-
javascript while语句和do while语句的区别分析_javascript技巧
-
c语言中如何用do...while语句求1到100的累加和
-
javascript while语句和do while语句的区别分析_javascript技巧