在C++中,偶尔需要使用一个空语句。例如,在实现assert()
时,在非调试配置下禁用它(也请参见此问题):
#ifdef _DEBUG
#define assert(x) if( !x ) { \
ThrowExcepion(__FILE__, __LINE__);\
} else {\
//noop here \
}
#else
#define assert(x) //noop here
#endif
到目前为止,我认为正确的方法是使用(void)0;
进行无操作:
(void)0;
但是我怀疑它可能会在某些编译器上触发警告 - 例如C4555:表达式没有效果; 预期具有副作用的表达式
,在这种特定情况下不会发出Visual C ++警告,但在没有向void
进行转换时会发出警告。
它是否普适? 有更好的方法吗?
;
来实现,(void)0;
(你的宏中不应包含;
,这应由调用者自行添加)。 - David Rodríguez - dribeas#define assert(x) //noop here
。 - AusCBlokeelse
与最内层的if
相绑定。如果您添加了不正确的缩进,它看起来可能会使人感到含糊不清,但事实并非如此。(一个具有足够高警告设置的编译器可能会声称它是模棱两可的,但在这种情况下,最好的解决方案是将编译器警告调整为您想要编写的代码,或者使用do { if(!x) ThrowException(__FILE__, __LINE__); } while(0)
。) - Chris Lutz