smallghost
V2EX  ›  程序员

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

By smallghost at 2013 年 10 月 20 日 · 4151 次点击
#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; }
6 条回复  •  1970-01-01 08:00:00 +08:00
loggerhead
   1
loggerhead  
   2013 年 10 月 20 日   ❤️ 1
有.
比如:
if (1)
SAFE_RELEASE_NULL(arg);
else
doSomeThing();

后者末尾加分号就错了
xpfd
   2
xpfd  
   2013 年 10 月 20 日
@loggerhead 正解,能不用宏的地方尽量不要用,尽量使用inline和enmu代替
iEverX
   3
iEverX  
   2013 年 10 月 20 日
@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
   4
yangxin0  
   2013 年 10 月 20 日
jokerlee
   5
jokerlee  
   2013 年 10 月 20 日
do while{...}用在宏里还有一个作用是{}之间是一个独立的作用域,里面定义的变量不会污染外部作用域
xgdyhaiyang
   6
xgdyhaiyang  
   2013 年 10 月 22 日
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
© 2026 V2EX · 28ms · 3.9.8.5