#define ... do{}while(0)
2010-03-30 10:53:12| 分类: C/C++ |举报 |字号 订阅
#define ... do{}while(0) 除了保证他是一个完整的语句块之外,还有很多好处: 1.因为宏替换是将原内容在替换处直接粘贴,加上do{ }while(0),能保证不会出现语法错误。 Method 1. #define FOO(a) { do_something_on(a); } if (isOK())
FOO(a); else FOO(b); ==> if (isOK()) { do_something_on(a); }; else { do_something_on(b); };
Damn! Doesn't compile!!!!
Method 2. #define FOO(a) do { do_something_on(a); } while (0) if (isOK()) FOO(a); else FOO(b); ==> if (isOK()) do { do_something_on(a); } while (0); else do { do_something_on(b); } while (0);
Hooray! It works!
也就是说,多条语句中用do{}while(0)封装,可以安全使用宏。
此外,如果do_something_on(a);同样是包含if else的语句,就好和原代码中的if else混淆,引起不必要的错误。
2.限制赋值,限制嵌套使用宏
#define ADD(a) do{a++;}while(0); #define ADD(a) a++; 我觉得他们还有一个区别是: int result = ADD(a);
ADD(ADD(a)); 如果是前者就不能这样赋值,从而起到限制赋值,限制嵌套使用宏。
|