看看这段代码:
#include <cassert>
#ifdef DEBUG
#define ASSERT(expr) assert(expr)
#else
#define ASSERT(expr)
#endif /* DEBUG */
程序只有在我定义了DEBUG
时才会运行,否则它会挂起并终止而没有结果。我在Eclipse Indigo CDT中使用MinGW。建议表示赞赏!
答案 0 :(得分:8)
如果不查看导致问题的实际代码,很难说清楚。我猜:你正在评估ASSERT()
内有副作用的表达式。例如,ASSERT( ++i < someotherthing )
在一个循环中。您可以通过临时将宏定义修改为expr
版本上的NDEBUG
来确认。确认这是原因后,请转到您发出的每个ASSERT
电话,以确保表达式无副作用。
答案 1 :(得分:7)
你几乎肯定滥用断言。断言表达式必须永远不会有副作用。
当您说assert(initialize_critical_space_technology());
,然后在发布版本中省略整行时,您可以想象自己会发生什么。
使用断言的唯一安全且理智的方法是使用值:
const bool space_init = initialize_critical_space_technology();
assert(space_init);
有些人为总是执行代码的东西引入了VERIFY
宏:
#define VERIFY(x) (x) // release
#define VERIFY(x) (assert(x)) // debug