码迷,mamicode.com
首页 > 其他好文 > 详细

#define XXX do{ XXX } while(0) 为什么会有这种用法

时间:2015-03-15 00:51:41      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:

#define XXX do{ XXX } while(0) 为什么会有这种用法


时常会遇到一个很"奇怪的宏定义", rt.(欧西巴...思考不够深刻啊, 皮鞭, 啪啪啪)


最近又遇到这家伙了,Quora上面Love神回答了这个问题, 我也就顶礼膜拜

http://www.quora.com/What-is-the-purpose-of-using-do-while-0-in-macros


这是C语言里面宏定义的时候,不会造成歧义或副作用的一种常用技巧.


考虑一下情况

#define foo(x)  bar(x); baz(x)


foo(wolf);


常规的,扩展成如下代码:

bar(wolf); baz(wolf);


这都还好,没啥问题.但是如果遇到if判断语句了,看看下面的例子.

f (!feral)
    foo(wolf);


这就扩展成了下面的形式,(⊙o⊙)看,是不是出现了你不想要粗线的情况捏?

这里if语句只能作用于第一个bar()函数,无法作用于第二个baz().但是这种方式很可能不是程序员的本意.

本意就是把foo单做一个整体嘛~


if (!feral)
    bar(wolf); baz(wolf);



等价于如下形式
if (!feral)
    bar(wolf);
baz(wolf);



离开了 do/while(0)你就别想把宏定义玩的跟函数一样一样的~

如果使用这种技巧定义宏定义, 

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


还是这个宏定义,这么用
f (!feral)
    foo(wolf);


就变成了如下形式.

if (!feral)
    do { bar(wolf); baz(wolf); } while (0);

等价于
if (!feral) {
    bar(wolf);
    baz(wolf);
}



你可能会想,用下面这种方式,加个{}不就解决问题了么?干嘛害的要do{} while(0)?
考虑如下情况
#define foo(x)  { bar(x); baz(x); }


if (!feral)
    foo(wolf);
else
    bin(wolf);


这就变成了
if (!feral) {
    bar(wolf);
    baz(wolf);
};
else
    bin(wolf);



注意!这里使得else变成了"臭名昭著的"dangling else.






技术分享

#define XXX do{ XXX } while(0) 为什么会有这种用法

标签:

原文地址:http://blog.csdn.net/cinmyheart/article/details/44264237

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!