linux内核分析及编程 1.3内核通用链表 一、宏定义(#define)时do{ }while(0)的价值

一、C语言中宏定义(#define)时do{}while(0)的价值

      初看这句话,这难道不是废话?然而是不是废话还有待商讨,毕竟内核里都有这句话的身影,你说该不该停下来思考一哈为什么要使用这句看起来像废话的东东。

//使用它的理由 我归结为三点(甚至你可以思考一下是不是有很多废话代码都有着这样美妙的优点)

1. 增加代码的适应性(关键)

@你想表达的意思是不变的(此处的宏定义就是为了替换文中原有语句),但是如何才能在不同环境下都能正确的表达出这个意思(因为使用环境是复杂的),这时这行精简的代码会提高你程序的适应性(健壮性)。

1》单独调用没毛病:

#define    FOO(x)

 foo(x); bar(x);

       例如:

                     FOO(100)

               宏扩展后变成:

                     foo(x);bar(x);

2》但是你要把这行代码放到一些别的地方就问题大了

     例如:

      // 把他放在控制语句里

      if (condition)

              FOO(x);

       else

              ...;

       //就会变成:

     if (condition)

             foo(x);

      bar(x);

      else

             ...;

                 -_-这个错误十分致命,因为编译器发现不了(他是个逻辑错误。只能肉眼扫描)

             //也许你会想到这样的宏定义

             #define FOO(x) { foo(x); bar(x); }

             //但是,请看下面:

             if(condition)

                          {foo(x);bar(x);} ;//花括号后面出现一个分号  -_-

             //那该怎么办?这个时候do{}while(0)的价值就出现了

             #define FOO(x) do { foo(x); bar(x); } while(0)

            

            

            if (condition)

                         do {

                          foo(x); bar(x);

                   } while(0)

               else

               ...;

   

2.增加代码的扩展性

@宏定义还可以引用别的宏

#define FOO(x) do{

                                 OTHER_FOO(x)

                            } while(0)

这样因为这行代码有适应性,所以,不管 OTHER_FOO(x)这是个单句的 宏定义,还是多个句子的宏定义,都能正常表达出该有的 意思。

3.增加代码的灵活性

@如果在 do { foo(x); bar(x); } while(0)中加一个if条件语句是不是就更加灵活了

#defineFOO(x)  do{ \

                                  foo(x);  \

                                  if(condition(x)) \

                                         break; \

                                   bar(x) \

                                   ..... \

                            } while(0)

如果你想知道为什么要加反斜杠和其他宏定义的知识,搜索

linux内核分析及编程 1.3内核通用链表  二:C语言宏定义的小知识

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值