说说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; } |