断言 C++问题失败

Assertion Failed in C++ questions

本文关键字:失败 问题 C++ 断言      更新时间:2023-10-16

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

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

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

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

现在,只有在事先定义了NDEBUG的情况下,条件才为真。

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

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

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

如果相等性测试需要很长时间,这是您希望在生产环境中避免的事情。但是,在调试/测试时,最好知道第一行实际上生成了一个与原始对象相等的副本。

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