do{ ... } while (0) ; 的学习——在宏定义里的作用

实例1,通过do while 0定义宏

#include<stdio.h>

#define SOMETHING() do{fool1();fool2();}while(0)

void fool1(void);
void fool2(void);

void fool1(void)
{
	printf("in fool1 \n");
}
void fool2(void)
{
	printf("in fool2\n");
}
int  main(void)
{
    int a = 5;
    if(a>0)
        SOMETHING();
    else
        printf("do nothing \n");

	return 0;
}

gcc编译后得到

in fool1 
in fool2

解析:do后面大括号里的程序运行一次,是期望得到的。

实例2:将do while 去掉,仅通过大括号定义宏

#include<stdio.h>

#define SOMETHING() {fool1();fool2();}

void fool1(void);
void fool2(void);

void fool1(void)
{
	printf("in fool1 \n");
}
void fool2(void)
{
	printf("in fool2\n");
}
int  main(void)
{
    int a = 5;
    if(a>0)
        SOMETHING();
    else
        printf("do nothing \n");
	return 0;
}

gcc 编译不过

解析:这种情况下,预编译展开后是这个样子的:

    if(a>0)
        {fool1();fool2();};
    else
        printf("do nothing \n");

相当于else前的大括号后面多了一个“;”,是不合法的。
此时,只有改成下面这样将SOMETHING()后的分号去掉才可以编译通过:

    if(a>0)
        SOMETHING()
    else
        printf("do nothing \n");

但是,一个函数语句后面不加分号,是不是怪怪的呢。

实例3,不加大括号定义宏

#include<stdio.h>

#define SOMETHING() fool1();fool2();

void fool1(void);
void fool2(void);

void fool1(void)
{
	printf("in fool1 \n");
}
void fool2(void)
{
	printf("in fool2\n");
}
int  main(void)
{
    int a = 5;
    if(a>0)
        SOMETHING();
    else
        printf("do nothing \n");
	return 0;
}

编译不通过
解析:预编译展开后是这个样子的:

    if(a>0)
        fool1();
    fool2();
    else
        printf("do nothing \n");

显而易见的错误。即便if 后面的条件不成立,fool2()语句也会执行。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值