查看: 10773|回复: 0

内核中的do while(0)

[复制链接]
发表于 2010-11-9 17:00:51 | 显示全部楼层 |阅读模式
台州网址导航
为什么在内核中碰到很多 #defines ... do{ ... } while(0)?

  有以下几点原因:

  ·空语句在编译时候会出现警告,所以有必要用#define FOO do { } while(0).

  ·这样做是为了能够在里面定义局部变量

  ·这样做是为了能够在条件语句中使用复杂的宏定义. 例如下面这段代码:

  #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()调用不能按期望那样工作。而使用 do { ... } while(0)定义后,就会展开成以下语句:

  if (blah == 2)

  do {

  printf("arg is %s\n", blah);

  do_something_useful(blah);

  } while (0);

  这是所期望的状况.

  ·如果你希望定义一个包含多行语句和一些局部变量的时候. 一般的定义方式只能这样:

  #define exch(x,y) { int tmp; tmp=x; x=y; y=tmp; }

  然而在某些情况下,这样并不能正常工作. 下面是包含两个分支的if语句:

  if (x > y)

  exch(x,y);          // Branch 1

  else

  do_something();     // Branch 2

  但这样却只能展开成单分支的if语句,如下:

  if (x > y) {                // 单分支if

  int tmp;

  tmp = x;

  x = y;

  y = tmp;

  }

  ;                           // 空语句

  else                        // 错误!!! "parse error before else"

  do_something();

  问题是由于在语句块后直接加入分号(;)引起的. 解决办法是将语句块放入 do 和 while (0)中间.这样就得到了一条单语句, 而不是被编译器判断为语句块.现在的if语句如下:

  if (x > y)

  do {

  int tmp;

  tmp = x;

  x = y;

  y = tmp;

  } while(0);

  else

  do_something();
台州维博网络(www.tzweb.com)专门运用PHP+MYSQL/ASP.NET+MSSQL技术开发网站门户平台系统等。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

网站推广
关于我们
  • 台州朗动科技(Tzweb.com)拥有多年开发网站平台系统门户手机客户端等业务的成功经验。主要从事:政企网站,系统平台,微信公众号,各类小程序,手机APP客户端,浙里办微应用,浙政钉微应用、主机域名、虚拟空间、后期维护等服务,满足不同企业公司的需求,是台州地区领先的网络技术服务商!

Hi,扫描关注我

Copyright © 2005-2026 站长论坛 All rights reserved

Powered by 站长论坛 with TZWEB Update Techonolgy Support

快速回复 返回顶部 返回列表