当我们要禁用断言时,我们必须定义NDEBUG,但为什么要在包含assert头文件之前定义它呢? 第二个问题:禁用断言和使用宏断言有什么意义?
答案 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()
来断言,并且在测试期间保持此断言时,您可以安全地禁用它们以进行发布。