空"释放"ASSERT宏崩溃程序?

Aut*_*tAM 6 c++ macros

看看这段代码:

#include <cassert>

#ifdef DEBUG
#define ASSERT(expr) assert(expr)
#else
#define ASSERT(expr)
#endif /* DEBUG */
Run Code Online (Sandbox Code Playgroud)

只有在我DEBUG定义的情况下,程序才会运行,否则它将挂起并终止,没有结果.我在Eclipse Indigo CDT中使用MinGW.建议表示赞赏!

K-b*_*llo 8

如果不查看导致问题的实际代码,很难说清楚.我的猜测:你正在评估一个带有副作用的表达式ASSERT().例如,ASSERT( ++i < someotherthing )在一个循环中.您可以通过临时将宏定义修改为仅exprNDEBUG构建上来确认.确认这是原因之后,转到ASSERT您发出的每个电话,以确保表达式没有副作用.


Ker*_* SB 7

你几乎肯定会滥用断言.断言表达式绝不能有副作用.

当您说,assert(initialize_critical_space_technology());然后在发布版本中省略整行时,您可以想象自己会发生什么.

使用断言的唯一安全且理智的方法是使用值:

const bool space_init = initialize_critical_space_technology();
assert(space_init);
Run Code Online (Sandbox Code Playgroud)

有些人为VERIFY总是执行代码的东西引入了一个宏:

#define VERIFY(x) (x)         // release
#define VERIFY(x) (assert(x)) // debug
Run Code Online (Sandbox Code Playgroud)