C语言中do...while(0)用法小结
2014-04-18 00:04
796 查看
在linux内核代码中,经常看到do...while(0)的宏,do...while(0)有很多作用,下面举出几个:
本文地址:http://www.cnblogs.com/archimedes/p/do-while-0.html,转载请注明源地址。
View Code
然而在某些情况下将会失效,下面的代码使用if...else...
但是将被解释为一个分支的if语句:
错误出在“;”直接位于代码块的后面,解决的办法是将代码嵌入do...while(0),于是得到下面的代码:
于是上面的宏可以修改为:
现在想像一下下面的代码:
这将解释为:
我们就会发现,if语句只作用于printf(), do_something_useful() 没按照愿意一起执行,即没有像你预期的那样被包含在if代码中,于是可以使用如下的代码块:
这样上面的宏就可以改为:
本文地址:http://www.cnblogs.com/archimedes/p/do-while-0.html,转载请注明源地址。
1、避免goto语句:
通常,如果一个函数开始要分配一些资源,然后如果在中途遇到错误则要退出函数,当然,退出前要释放资源,我们的代码可能如下:#defien N 10 bool Execute() { //分配资源 int *p = (int *)malloc(N * sizeof(int)); bool bOK = true; do { //执行并进行错误处理 bOK = fun1(); if(!bOK) break; bOK = fun2(); if(!bOK) break; bOK = fun3(); if(!bOK) break; //......... } while(0); //释放资源 free(p); p = NULL; return bOK; }
View Code
2、避免空声明在编译时出现警告:
在linux内核源代码中,经常看到如下宏以避免在编译时出现警告:#define FOO do { } while(0)
3、编写符合习惯的代码块:
你可能经常会使用如下的宏:#define exch(x,y) { int tmp; tmp=x; x=y; y=tmp; }
然而在某些情况下将会失效,下面的代码使用if...else...
if (x > y) exch(x,y); // 分支 1 else do_something(); // 分支 2
但是将被解释为一个分支的if语句:
if (x > y) { int tmp; tmp = x; x = y; y = tmp; } ; // 空语句 else // ERROR!!! do_something();
错误出在“;”直接位于代码块的后面,解决的办法是将代码嵌入do...while(0),于是得到下面的代码:
if (x > y) do { int tmp; tmp = x; x = y; y = tmp; } while(0); else do_something();
于是上面的宏可以修改为:
#define exch(x,y) do {\ int tmp;\ tmp = x;\ x = y;\ y = tmp;\ } while(0)
4、在条件语句中使用复杂的宏:
假如一个宏包含类似如下几行代码:#define FOO(x) \ printf("arg is %s\n", x); \ do_something_useful(x);
现在想像一下下面的代码:
if (blah == 2) FOO(blah);
这将解释为:
if (blah == 2) printf("arg is %s\n", blah); do_something_useful(blah);;
我们就会发现,if语句只作用于printf(), do_something_useful() 没按照愿意一起执行,即没有像你预期的那样被包含在if代码中,于是可以使用如下的代码块:
if (blah == 2) do { printf("arg is %s\n", blah); do_something_useful(blah); } while (0);
这样上面的宏就可以改为:
#define FOO(x) do { \ printf("arg is %s\n", blah);\ do_something_useful(blah);\ } while (0)
相关文章推荐
- do{...}while(0)的用法小结
- do...while(0)在宏定义中的巧妙用法
- C语言中do...while(0)的妙用
- do{...}while(0)的意义和用法
- 循环语句小结 for while do-while
- JS中continue在while循环、do-while循环以及for循环中的用法
- 通过源码学习do{}while(0)的用法
- C语言中宏定义(#define)时do{}while(0)的价值(转)
- do-while(0)的妙用及MultiByteToWideChar和WideCharToMultiByte的用法
- do{...}while(0)的意义和用法
- 《IOS_C语言》while|循环,do...while循环,for循环
- do{...}while(0)的意义和用法
- do{...}while(0)的用法
- do{...}while(0)的意义和用法
- do {} while (0) 用法
- C语言中for循环,while循环与do-while 循环的比较
- do{...}while(0)的意义和用法
- do...while(0)的用法
- 2. C# -- do{...} while();while(){...};for()的用法
- C语言中while与do-while的介绍与注意事项