C++复习 assert

  1. assert预处理宏
  2. NDEBUG预处理变量
  3. UE4 断言
    1. check族
    2. verify族
    3. ensure族

assert预处理宏

  • 由预处理器管理,可以直接使用

  • 断言,是宏,而非函数。assert 宏的原型定义在 (C)、(C++)中,其作用是如果它的条件返回错误,则终止程序执行。可以通过定义 NDEBUG 来关闭 assert,但是需要在源代码的开头,include 之前。

无需std或using声明

NDEBUG预处理变量

  • NDEBUG可以决定assert是否启用。但是注意要定义在assert声明之前。具体看以下连接

https://www.zhihu.com/question/23075111

  • 一些局部静态变量,可以用于调试

//assert() 使用
#define NDEBUG          // 加上这行,则 assert 不可用
#include <assert.h>

assert( p != NULL );    // assert 不可用

UE4 断言

  • 源码位置

    Engine/Source/Runtime/Core/Public/Misc/AssertionMacros.h

check族

  • Check族系最接近基础 assert,因为当第一个参数得出的值为false时,此族系的成员会停止执行,且默认不会在发布版本中运行。

  • 检查宏在调试(Debug)、开发(Development)、测试(Test)和发布编辑器(Shipping Editor)版本中运行(以”Slow”结尾的宏除外,其仅在调试(Debug)版本中运行)。定义 USE_CHECKS_IN_SHIPPING 以保留一个true值(通常为 1),使Check宏可在所有版本中运行。

    此法在以下情况中十分实用:怀疑Check宏中的代码正在修改值;发现了仅存在于在发布版本中且难以追踪的bug,但认为现有Check宏能找到这些bug。项目发布时应将 USE_CHECKS_IN_SHIPPING 设为默认值 0。

verify族

  • 在大部分版本中,Verify族系的行为与Check族系相同。但即便在禁用Check宏的版本中,Verify宏也会计算其表达式的值。这意味着仅当该表达式需要独立于诊断检查之外运行时,才应使用Verify宏。

  • 验证宏在调试(Debug)、开发(Development)、测试(Test)和发布编辑器(Shipping Editor)版本中完整运行(以”Slow”结尾的宏除外,其仅在调试(Debug)版本中运行)。定义 USE_CHECKS_IN_SHIPPING 来保留一个true值(通常为 1),从而覆盖此行为。

  • 在所有其他情况下,Verify宏将计算其表达式,但不会停止执行或将文本输出到日志。

ensure族

  • Ensure族系类似于Verify族系,但可在出现非致命错误时使用。若Ensure宏的表达式计算得出的值为false,引擎将通知崩溃报告器,但仍会继续运行。

  • 为避免崩溃报告器收到太多通知,Ensure宏在每次引擎或编辑器会话中仅报告一次。若实际情况需要Ensure宏在每次表达式计算得值为false时都报告一次,则使用”Always”版本的宏。

  • Ensure宏在所有版本中计算其表达式的值,但仅在调试(Debug)、开发(Development)、测试(Test)和发布编辑器(Shipping Editor)版本中联系崩溃报告器。