文章原文:https://blog.csdn.net/tianxieeryang/article/details/86687065
返回知识列表:
1. 问题演示
为什么要这么用,举一个错误例子示范就可以了
void print1() {
printf("Hello 1");
}
void print2() {
printf("Hello 2");
}
#define func() print1();print2();
int main() {
if (0)
func();
return 0;
}
会不会有输出?
答案是有的。 再到前面看一下黄色字体,#define是在预处理的时候进行直接替换。
是不是理解了,会输出 hello 2
上面例子编译后main 函数是这样的:
int main() {
if (0)
print1();
print2();
return 0;
}
2. 正确做法 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;
这样才是达到我们的设计目的。而不会出现二义性!
本文通过实例对比展示了宏定义在预处理阶段的直接替换可能导致的意外输出问题,并介绍了如何使用do{...}
 #define 和 do{...}while0 的妙用&spm=1001.2101.3001.5002&articleId=107319915&d=1&t=3&u=3e95c3f5ebb7480e8f43d2ad8a5c6034)
1512

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



