说说do{}while(0)的用法,
1、消除goto语句
大家都知道C语言中不提倡使用goto语句,但是有些场合必须使用goto语句,goto语句是程序捉摸不定,跳来跳去,很危险,所以经验丰富的程序员会 尽量少的使用goto语句,尽可能多的使用其他语句代替goto语句,那么什么语句可以代替goto语句呢? 请看下面的例子:
在一些程序条件错误的时候,我们会让他提前结束,这时我们也许会使用goto语句方便解决,比如下面的malloc语句申请未成功时:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include 
#include
#include
 
#define BUFLEN 100
 
int main()
{
char *a,*b,*c;
 
a = (char *)malloc(sizeof(char) * BUFLEN);
if(a != NULL)
strcpy(a,"I'm a,and nice to meet you!");
else goto ERR;
b = (char *)malloc(sizeof(char) * BUFLEN);
if(b != NULL)
strcpy(b,"I'm b,and nice to meet you a too!");
else goto ERR;
c = (char *)malloc(sizeof(char) * BUFLEN);
if(c != NULL)
strcpy(c,"I'm a,and nice to meet you a and b too!");
else goto ERR;
printf("%s\n%s\n%s\n",a,b,c);
free(a);
free(b);
free(c);
 
 
ERR:
return 0;
}

那么我们可以使用do{}while(0)方便将其替换,看看下面的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include 
#include
#include
 
#define BUFLEN 100
 
int main()
{
char *a,*b,*c;
 
do {
a = (char *)malloc(sizeof(char) * BUFLEN);
if(a != NULL)
strcpy(a,"I'm a,and nice to meet you!");
else break;
b = (char *)malloc(sizeof(char) * BUFLEN);
if(b != NULL)
strcpy(b,"I'm b,and nice to meet you a too!");
else break;
c = (char *)malloc(sizeof(char) * BUFLEN);
if(c != NULL)
strcpy(c,"I'm a,and nice to meet you a and b too!");
else break;
printf("%s\n%s\n%s\n",a,b,c);
free(a);
free(b);
free(c);
} while(0);
 
return 0;
}

看见了吗,轻松搞定,呵呵,例子不是很好,不过相信你以后编写更大的C语言项目时,你可能会经常感受到do{}while(0)带给你惊喜!
2、功能强大的宏定义
看下边的代码,如果你把宏定义中的do{}while(0)去掉的话,你编译会不通过的,知道为什么吗?自己找找看!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include 
#include
 
#define do_while0(cond) do { \
if((cond)) \
printf("The condition is met!\n"); \
else { \
printf("The condion is not met!\n"); \
break; \
} \
printf("haha,I can do what I want to do!\n"); \
} while(0)

 
int main()
{
int cond;
printf("I'll test do{}while(0)!\n");
printf("Please input your cond(0 or 1):");
scanf("%d",&cond);
do_while0(cond);
return 0;
}