c++宏定义

c++宏定义

c++宏往往定义成 do while (0) 的形式。Why?

#define SET_ERROR_INFO(error_var, error_val)    \
  do { if (error_var) *error_var = error_val; } while (0)

1. 形成一条语句,可以用在if等语句后面

#define FOO() \
  do_sth1(); \
  do_sth2()

if (true)
  FOO();

如果这样定义宏,放在if语句后,只会只有do_sth1属于if block,do_sth2在if block外,总会被执行,显然不符合预期。

那么问题来了,为什么不能定义成下面这样?非定义成do while(0)。一定是有原因的,看下一小节哈。

#define FOO() { \
  do_sth1(); \
  do_sth2(); \
}

2. why not定义成{}形式,非要用do while(0)

if (true)
  Foo();
else
  do_sth();

如果宏定义成{},上面的语句会编译报错,定义成do while(0)就不会。Why?

定义成{}时,else是找不到与之匹配的if的,因为if后面跟了两个语句{};。定义成do while(0)时就没有问题。

posted @ 2014-11-23 11:54  bitcold  阅读(458)  评论(0)    收藏  举报