作为 C 新手,我无法理解以下代码:
#define errExit(msg) do { perror(msg); exit(EXIT_FAILURE); \
} while (0)
我收集到这个函数是#define
d 的原因是要覆盖现有函数,但是do ... while(0)
带有无条件 exit()
语句的循环有什么意义呢?没有循环结构就不可能写这个吗?
作为 C 新手,我无法理解以下代码:
#define errExit(msg) do { perror(msg); exit(EXIT_FAILURE); \
} while (0)
我收集到这个函数是#define
d 的原因是要覆盖现有函数,但是do ... while(0)
带有无条件 exit()
语句的循环有什么意义呢?没有循环结构就不可能写这个吗?
我认为这里有很多重复项。
该do...while(0)
技巧使您可以errExit
在各种情况下使用而不会破坏任何东西:
if(x) errExit(msg);
else return 1;
被翻译成:
if(x) do { ...; ...; } while(0);
else return 1;
例如,如果省略该do...while(0)
部分,则无法可靠地添加分号。
假设宏没有do { ... } while(0)
循环,只有里面的 2 个语句。现在,如果我要写
if( foo() )
errExit("foo!" );
我的有条件退出变成了无条件退出。
对于多个语句的宏函数,这种do { ... } while(0)
构造很常见,通常被认为是最佳实践,例如 this。它允许用作单个语句,因此没有意外。