0

when we want to disable assertion we have to define NDEBUG but why should we define it before the inclusion of assert header file??
the second question: what is the point in disabling assertion and using the macro assert??

4

1 回答 1

2

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

因为assert定义类似于以下代码片段

#ifdef NDEBUG

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

NDEBUG现在,只有事先定义好条件才会为真。

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

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

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

如果平等测试需要很长时间,那么在生产环境中您应该避免这种情况。但是,在调试/测试时,很高兴知道第一行实际上生成了一个与原始对象相等的副本。

总而言之,您可以assert()在开发/调试时断言某些内容,并且当此断言在测试期间成立时,您可以安全地禁用它们以进行发布。

于 2013-09-11T22:39:03.870 回答