看看这段代码:
#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.建议表示赞赏!
如果不查看导致问题的实际代码,很难说清楚.我的猜测:你正在评估一个带有副作用的表达式ASSERT()
.例如,ASSERT( ++i < someotherthing )
在一个循环中.您可以通过临时将宏定义修改为仅expr
在NDEBUG
构建上来确认.确认这是原因之后,转到ASSERT
您发出的每个电话,以确保表达式没有副作用.
你几乎肯定会滥用断言.断言表达式绝不能有副作用.
当您说,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)