我们在有些代码中特别是linux内核源码中会见到这样的宏定义形式:#define MACRO_DATA do{........}while(0);这个do{...}while(0),表达式内一般会封装多个语句。那么如此的定义形式有什么作用呢?
1.如果我们如此定义
#define FOO(x) foo(x); bar(x)
if (condition)
FOO(x);
else // syntax error here
...;
展开则是这样的:
if (condition)
foo(x); bar(x) ;
else // syntax error here
...;
注意到bar(x)则不再是if 表达式的作用域内了。
2.如果如此定义:
#define FOO(x) { foo(x); bar(x); }
那我们将需如此使用
if (condition)
FOO(x) //省略分号,但这违反我们的直观感觉
else
...
3.
#define FOO(x) do { foo(x); bar(x); } while (0)
这样定义就能达到预定效果了。
if (condition)
FOO(x);
else
....