断言在C ++问题中失败

时间:2013-09-11 22:32:42

标签: c++

当我们要禁用断言时,我们必须定义NDEBUG,但为什么要在包含assert头文件之前定义它呢? 第二个问题:禁用断言和使用宏断言有什么意义?

1 个答案:

答案 0 :(得分:2)

  

当我们想要禁用断言时,我们必须定义NDEBUG,但为什么要在包含assert头文件之前定义它呢?

因为assert已定义similarly to the following code fragment

#ifdef NDEBUG

#define assert(condition) ((void)0)
#else
#define assert(condition) /*implementation defined*/
#endif

现在,只有事先定义了NDEBUG,条件才会成立。

  

第二个问题:禁用断言和使用宏断言有什么意义?

断言成本运行时。您仍然希望它们保留在已发布的产品中,但您不想检查它们。例如:

auto a = b;
assert(a == b);

如果相等测试需要花费很多时间,那么在生产环境中您需要避免这种情况。但是,在调试/测试时,最好知道第一行实际上产生的副本等于原始对象。

总而言之,您在开发/调试时使用assert()来断言,并且在测试期间保持此断言时,您可以安全地禁用它们以进行发布。