Linux c/c++编程--知识点(1) #define 和 do{...}while(0) 的妙用

本文通过实例对比展示了宏定义在预处理阶段的直接替换可能导致的意外输出问题,并介绍了如何使用do{...}

文章原文: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;

这样才是达到我们的设计目的。而不会出现二义性!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ricardo于

你的鼓励将是牛马的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值