在许多C/C++宏中,我看到宏的代码包含在看似无意义的do while循环中.这是一些例子.
#define FOO(X) do { f(X); g(X); } while (0)
#define FOO(X) if (1) { f(X); g(X); } else
Run Code Online (Sandbox Code Playgroud)
我看不出它do while在做什么.为什么不在没有它的情况下写这个?
#define FOO(X) f(X); g(X)
Run Code Online (Sandbox Code Playgroud) 由于本答案中描述的原因,我经常在我的#defines中使用do-while(0)构造.此外,我正在尝试使用尽可能高的编译器警告级别来捕获更多潜在问题,并使我的代码更加健壮和跨平台.所以我通常使用-Wallgcc和/WallMSVC.
不幸的是,MSVC抱怨do-while(0)构造:
foo.c(36) : warning C4127: conditional expression is constant
Run Code Online (Sandbox Code Playgroud)
我应该怎么做这个警告?
只是为所有文件全局禁用它?对我来说这似乎不是一个好主意.
我在阅读一些源代码时发现了这一点.
#define MACRO(x) if((void) 0, (x)); else some_func();
Run Code Online (Sandbox Code Playgroud)
我不完全理解操作符逗号和void转换背后的原因.这可能与宏保护有关,我知道(void)0有时用来保护else宏中的级联,例如in if(...) then foo(); else (void)0.
为什么运算符逗号有什么想法?
编辑:我开始认为这与猫头鹰有关 (0,0).