C 语言宏定义中使用do...while(0)

 最近看到C语言的项目中在宏定义中使用了do...while(0),感到是个知识点,特来总结。

 先看这句话:do{...}while(0)在C中是唯一的构造程序,让你定义的宏总是以相同的方式工作,这样不管怎么使用宏(尤其在没有用大括号包围调用宏的语句),宏后面的分号也是相同的效果。这句话的意思是说,在宏定义中使用do...while(0)包含的所有语句是一个代码块,不会受到{};的影响。

看一个例子:

#include <stdio.h>
#include <stdlib.h>
#define TEST(p)                             \
        do                                  \
        {                                   \
            if(p!=NULL)                     \
            {                               \
                free(p);                    \
                printf("free success!\n");  \
            }                               \
            p=NULL;                         \
        }while(0)

int main()
{
    int *p=NULL;
    p=(int*)malloc(sizeof(int));
    TEST(p);
    printf("---------done!---------\n");
    return 0;
}

  \的作用是这一行的语句没有完,下一行内容是跟上一行联在一起的。

 

 

再来看一个出错的例子:

宏定义:  #define foo(x) bar(x); baz(x)

然后调用:       foo(x);  这样根据宏替换的原则就是:  bar(x);baz(x);          这是正确的!

但是如果这样:     if()

          foo(x)

就会被替换成:    if()

          bar(x);

        baz(x);              这显然是和我们希望执行的是不一样的!

 

 

 

为什么不用大括号直接把宏包围起来呢?为什么非得使用do/while(0)逻辑呢?

按照上面的例子:

if ()

{

     bar(wolf);
     baz(wolf);
};     //最后会添加;,在语法上是错误的!

转载于:https://www.cnblogs.com/scf141592/p/7513943.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值