做{...} while(0) - 有什么好处?
可能重复:
为什么在C / C ++宏中有时会出现无意义的do / while和if / else语句?
我已经看到这个表达超过10年了。 我一直在想着它有什么好处。 由于我主要在#defines中看到它,因此我认为它适用于内部作用域变量声明和使用中断(而不是gotos)。
对其他任何东西都有好处吗? 你用它吗?
这是C语言中唯一可用于#define
多语句操作的构造,在后面放置分号并仍在if
语句中使用。 一个例子可能有助于:
#define FOO(x) foo(x); bar(x)
if (condition)
FOO(x);
else // syntax error here
...;
即使使用大括号也无济于事:
#define FOO(x) { foo(x); bar(x); }
在if
语句中使用它会要求你省略分号,这是违反直觉的:
if (condition)
FOO(x)
else
...
如果你像这样定义FOO:
#define FOO(x) do { foo(x); bar(x); } while (0)
那么以下语法正确:
if (condition)
FOO(x);
else
....
这是一种简化错误检查并避免深层嵌套if的方法。 例如:
do {
// do something
if (error) {
break;
}
// do something else
if (error) {
break;
}
// etc..
} while (0);
它有助于将多个语句分组到一个语句中,以便类似函数的宏实际上可以用作函数。 假设你有
#define FOO(n) foo(n);bar(n)
你也是
void foobar(int n){
if (n)
FOO(n);
}
然后这扩展到
void foobar(int n){
if (n)
foo(n);bar(n);
}
注意第二个调用(bar(n))不再是if语句的一部分。
将两者封装在do {} while(0)中,并且还可以在if语句中使用宏。
链接地址: http://www.djcxy.com/p/84407.html