C语言中常见的做法是使用:
#define FOO() do { /* body */ } while (0)
虽然这样做没问题,但也可以这样做:
#define FOO() { /* body */ }((void)0)
{...}((void)0)
有许多类似的好处:您不会意外合并逻辑,并且需要在行尾加上;
,所以像这样奇怪的表达式就不会被忽略:FOO() else {...}
。
我唯一注意到的区别是它意味着您需要在if语句中使用大括号。
if (a)
FOO();
else
BAR();
必须按照以下方式编写:
if (a) {
FOO();
} else {
BAR();
}
除了这种怪异的情况外,它似乎运行良好,可以防止使用“do/while”方法时出现相同类型的问题。这两种方法之间是否有显着的差异?换句话说,如果您看到一个使用“{...}((void)0)”的代码库,请问除了已经注意到的一个差异之外,是否有实际原因要转换为使用“do{...}while(0)”?
do { ... } while(0)
这种变体,而不是其他的。 - Jerry Coffin