空“释放”ASSERT宏崩溃程序?

时间:2011-11-16 19:35:58

标签: c++ macros

看看这段代码:

#include <cassert>

#ifdef DEBUG
#define ASSERT(expr) assert(expr)
#else
#define ASSERT(expr)
#endif /* DEBUG */

程序只有在我定义了DEBUG时才会运行,否则它会挂起并终止而没有结果。我在Eclipse Indigo CDT中使用MinGW。建议表示赞赏!

2 个答案:

答案 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