看看这两个宏定义有啥区别

2013-10-20 08:32:26 +08:00
 smallghost
#define SAFE_RELEASE_NULL(p) do { if(p) { (p)->release(); (p) = 0; } } while(0)

上面这个宏定义和下面的有区别吗?
#define SAFE_RELEASE_NULL(p) if(p) { (p)->release(); (p) = 0; }
3114 次点击
所在节点    程序员
6 条回复
loggerhead
2013-10-20 08:49:36 +08:00
有.
比如:
if (1)
SAFE_RELEASE_NULL(arg);
else
doSomeThing();

后者末尾加分号就错了
xpfd
2013-10-20 09:29:25 +08:00
@loggerhead 正解,能不用宏的地方尽量不要用,尽量使用inline和enmu代替
iEverX
2013-10-20 14:50:09 +08:00
@loggerhead 所说确实是一个方面

最重要应该是,while(0)把一个语句块包起来,整个宏就就类似于一个语句一样。

#define A(arg) dosth(arg);doanother(arg)
#define B(arg) do { dosth(arg);doanother(arg); } while(0)

if (xxx) A(arg); // 这一行和下一行,doanother(arg)的执行有区别
if (xxx) B(arg);
yangxin0
2013-10-20 16:31:07 +08:00
jokerlee
2013-10-20 23:40:52 +08:00
do while{...}用在宏里还有一个作用是{}之间是一个独立的作用域,里面定义的变量不会污染外部作用域
xgdyhaiyang
2013-10-22 13:09:34 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/86161

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX