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的作用仅限于将语句整合为一个完整的模块,并不用于循环,实际语句仍是顺序执行一次。

 

posted @ 2021-02-07 16:25  Yu_tiann  阅读(446)  评论(0编辑  收藏  举报