可能的重复:
为什么 C/C++ 宏中有时会出现无意义的 do/while 和 if/else 语句? https://stackoverflow.com/questions/154136/why-are-there-sometimes-meaningless-do-while-and-if-else-statements-in-c-c-macr
do { ... } while (0) 它有什么好处? https://stackoverflow.com/questions/257418/do-while-0-what-is-it-good-for
我正在编写一些充满如下宏的 C 代码:
#define SAFE_FREE(x) do { if ((x) != NULL) {free(x); x=NULL;} } while(0)
谁能解释一下这个宏的作用以及原因do {} while(0)
需要吗?那不是只执行一次代码吗?
do { stuff() } while(0);
正在做与 stuff() 完全相同的事情。那么有什么大不了的呢?问题在于宏的语法。假设我们定义宏如下:
#define SAFE_FREE(x) if ((x) != NULL) { free(x); x=NULL; }
那么,有两个问题。第一个相对较小:SAFE_FREE 的使用不再需要尾随分号。但更重要的是,代码如下:
if (...)
SAFE_FREE(x)
else
stuff();
将扩展到:
if (...)
if ((x) != NULL) {
free(x);
x = NULL;
} else
stuff();
注意,如何else
现在匹配错误if
陈述。这完全改变了程序流程,尽管它在源代码中看起来并不像这样。
如上所述定义宏可以防止上面的奇怪行为,因为do { ... } while(0)
其作用就像一个没有分号的语句。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)