分享

#define ... do{}while(0)

 dsplog 2014-05-26

#define ... do{}while(0)  

2010-03-30 10:53:12|  分类: C/C++ |举报 |字号 订阅

#define ... do{}while(0) 除了保证他是一个完整的语句块之外,还有很多好处:

1.因为宏替换是将原内容在替换处直接粘贴,加上do{ }while(0),能保证不会出现语法错误。
Method 1.
#define FOO(a) { do_something_on(a); }
if (isOK())

   FOO(a);
else
    FOO(b);
==>
if (isOK())
    { do_something_on(a); };
else
    { do_something_on(b); };

Damn!  Doesn't compile!!!!

Method 2.
#define FOO(a) do { do_something_on(a); } while (0)
if (isOK())
    FOO(a);
else
    FOO(b);
==>
if (isOK())
    do { do_something_on(a); } while (0);
else
    do { do_something_on(b); } while (0);

Hooray!  It works!

也就是说,多条语句中用do{}while(0)封装,可以安全使用宏。

此外,如果do_something_on(a);同样是包含if else的语句,就好和原代码中的if else混淆,引起不必要的错误。

2.限制赋值,限制嵌套使用宏

  #define   ADD(a)   do{a++;}while(0);  
  #define   ADD(a)   a++;      
  我觉得他们还有一个区别是:  
  int   result   =   ADD(a);

  ADD(ADD(a));  
  如果是前者就不能这样赋值,从而起到限制赋值,限制嵌套使用宏。 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多