如你看到的 这里 该 do {} while(0) 允许在宏中有多行时避免编译错误或工作不正常,并尝试以与c函数相同的方式调用宏(这是每个人都这样做的方式)。
do {} while(0)
作为一个例子(我在这里报告链接中的那个,所以你不需要浏览页面)
#define DO_SOMETHING_HERE(_x) foo(_x); bar(_x); if( condition ) DO_SOMETHING_HERE(_x); else ...
将生成编译错误,因为它将导致:
if( condition ) foo(_x); bar(_x);; else ...
使用do虽然一切都会正常工作,但事实上它将是:
#define DO_SOMETHING_HERE(_x) do{ foo(_x); bar(_x); }while(0) if( condition ) do{ foo(_x); bar(_x); } while(0); else ...
请注意,在这种情况下,使用大括号不会保存您,因为:
#define DO_SOMETHING_HERE(_x) { foo(_x); bar(_x); } if( condition ) { foo(_x); bar(_x); }; else ...
仍会产生错误。
在你的情况下,我认为它只是一种编码风格,因为只有一行。
使用这种循环定义,您可以使用 break 内部陈述。这允许更容易的错误处理。例:
break
do { /* A lot of code */ if(error) break; /* A lot of code */ { while(0)