项目场景:
有些同学可能不了解”宏“的编写技巧
简单说明一下,反斜线代表该行未结束,会串接下一行。而如果宏里有多过一个语句,就需要用 do { /…/ } while(0) 包裹成单个语句,否则会有如下的问题。
问题描述:
我们知道,在预处理之后就会把代码中所有的宏定义编译成对应的代码,仅仅定义数量级别的时候,不会出现问题,但是在宏内定义函数时候一定注意。
内部定的一些符号 比如 ;
#define M() a(); b()
if (cond)
M();
else
c();
/* 预处理后 */
if (cond)
a(); b(); /* b(); 在 if 之外 */
else /* <- else 缺乏对应 if */
c();
只用{} 也不行;
#define M() { a(); b(); }
/* 预处理后 */
if (cond)
{ a(); b(); }; /* 最后的分号代表 if 语句结束 */
else /* else 缺乏对应 if */
c();
用 do while 就行了
#define M() do { a(); b(); } while(0)
/* 预处理后 */
if (cond)
do { a(); b(); } while(0);
else
c();
这样就可以 把一个具有函数定义的宏 拿来用;