宏定义中的do {...} while(0)

本文通过实例解释了在C++宏定义中使用do{...}

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在看一些C++源代码的时候发现很多的宏定义中使用了do {…} while(0)这样的语法,当时觉得很奇怪,感觉这样的语法并没有意义,后来在网上查了相关的资料才发现它的微妙之处。
假如我们有这样一个例子:

#define FUNC(x) func1(x);func2(x)

int main()
{
    int x = 0;
    FUNC(x);
}

那么在编译的预处理的过程中,编译器会对宏进行展开:

int main()
{
    int x = 0;
    func1(x);func2(x);
}

这样程序是没有任何问题的。如果程序是这样调用宏的呢?

#define FUNC(x) func1(x);func2(x);

int main()
{
    int x = 0;
    if (test(x))
        FUNC(x);
}

对宏进行展开:

int main()
{
    int x = 0;
    if (test(x))
        func1(x);func2(x);
}

对代码进行排版:

int main()
{
    int x = 0;
    if (test(x))
        func1(x);
    func2(x);
}

那么这样展开后,无论test(x)是否为true,程序都会执行func2(x),这就有可能会出现问题了。其实我们的目的是如果test(x)为true就执行func1(x)和func2(x),否则都不执行。
宏定义加上do(…)while(0)就可以解决这个问题了:

#define FUNC(x) do (func1(x);func2(x);) while(0)

int main()
{
    int x = 0;
    if (test(x))
        FUNC(x);
}

展开宏定义,程序变为:

int main()
{
    int x = 0;
    if (test(x))
        do (func1(x);func2(x);) while(0)
}

这样程序就能按照我们的想法运行了。

概括来说,宏定义中使用do(…)while(0)可以使得宏能够不受大括号,分号等的影响,总是能够按照预期的方式运行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值