C语言宏编写技巧——使用do { /*...*/ } while(0)
1、多于一条语句的宏:
当C语言中的宏定义包含了多余一条语句时,如下面这种情况:
#define M() a(); b()
如果后面的程序需要使用这个定义的宏M(),则可能产生错误。
2、错误演示:
#define M() a(); b() if (cond) M(); else c(); /* 预处理后 */ if (cond) a(); b(); /* 分号会直接将if结束掉*/ else /* <- else 缺乏对应 if */ c();
即使使用了{ }也还是会产生类似的错误:
#define M() { a(); b(); } /* 预处理后 */ if (cond) { a(); b(); }; /* 最后的分号代表 if 语句结束 */ else /* else 缺乏对应 if */ c();
3、解决方法:( 使用do while(0) )
#define M() do { a(); b(); } while(0) /* 预处理后 */ if (cond) do { a(); b(); } while(0); else c();
注意:这里的do while的作用仅限于将语句整合为一个完整的模块,并不用于循环,实际语句仍是顺序执行一次。