【发布时间】:2025-12-29 15:55:12
【问题描述】:
有时需要在 C++ 中使用无操作语句。例如,当实现在非调试配置中禁用的assert() 时(另见this question):
#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: expression has no effect; expected expression with side-effect Visual C++ 警告,它不会针对这种特殊情况发出,但在没有强制转换为 void 时会发出。
它是通用便携的吗?有没有更好的办法?
【问题讨论】:
-
拥有基于 DEBUG/RELEASE 改变程序行为的宏通常不是一个好主意...您最终可能会遇到 DEBUG(易于使用) 构建行为正确,但 RELEASE 构建没有。作为一个无操作:
;应该这样做,(void)0;(你的宏不应该包含;,应该由调用者添加) -
@David Rodríguez - dribeas:是的,我知道,但在非调试版本中禁用断言是一种普遍的做法,我仅将其用作示例。
-
我不明白为什么你需要在一个空的 else 块中插入一个 no-op。如果您想稍后填写,可以将 else 块留空。
-
@ziu 他在谈论
#define assert(x) //noop here -
@sstn - 这不是模棱两可的。 C 语法指定
else与最里面的if绑定。如果您添加不正确的缩进,它看起来模棱两可,但事实并非如此。 (警告设置足够高的编译器可能会声称它不明确,但在这种情况下,最好的解决方案是将编译器警告调整为您要编写的代码,或使用do { if(!x) ThrowException(__FILE__, __LINE__); } while(0)。)