信息
文章中可能会出现一些错误,希望大佬们可以在评论区指出错误,感谢支持!
10 - 断言
本文主要介绍了UE5中的断言,它可以在开发期间帮助检测和诊断不正常或无效的程序运行时条件。UE5提供了如下三种断言:
CheckVerifyEnsure
这三种断言相关的宏可在Engine/Source/Runtime/Core/Public/Misc/AssertionMacros.h中查看。
check
Check系列的断言是最接近C++assert的,当第一个参数计算值为false时,程序会立刻停止执行,并默认不会在发布版本中运行。
| 宏 | 参数 | 行为 |
|---|---|---|
check()或checkSlow() | 表达式 | 若表达式为false,停止执行 |
checkf()或checkfSlow() | 表达式,格式化文本 | 若表达式为false,停止执行;并将格式化文本输出到日志 |
checkCode() | 代码 | 在一次do-while循环中执行代码,主要用于准备另一个Check所需的信息 |
checkNoEntry() | - | 若此行被执行,程序停止执行,主要用于不可到达的代码路径 |
checkNoReentry() | - | 若此行被执行超过一次,则程序停止执行 |
checkNoRecursion() | - | 若此行被递归执行,则程序停止执行 |
unimplemented() | - | 若此行被执行,程序停止执行,主要用于应被重写而不被调用的虚函数实现 |
其中,这些宏仅在Debug和Development环境下运行,Slow结尾的宏仅在Debug环境下运行。
如果:
- 怀疑
Check宏中的代码在修改值; - 发现仅存在于发布版本(
Shipping)中的难以追踪的bug;
可以设置USE_CHECKS_IN_SHIPPING=1在Test和Shipping环境下启用这些宏,调试后记得还原设置。
verify
Verify系列断言应该在Check系列断言的范围外使用,它可以在发布版本中运行。
| 宏 | 参数 | 行为 |
|---|---|---|
verify() 或 verifySlow() | 表达式 | 若表达式为false,停止执行 |
verifyf() 或 verifyfSlow | 表达式,格式化文本 | 若表达式为false,停止执行;并将格式化文本输出到日志 |
其中,这些宏仅在Debug,Development,Test和Shipping Editor版本中完整运行,Slow结尾的宏仅在Debug环境下运行。在上述其他情况下,Verify系列断言只会计算表达式,而不会让程序停止执行或输出文本到日志。
ensure
Ensure系列断言和Verify系列断言类似,但仅可在出现非致命错误时使用。也就是说,如果Ensure系列断言被触发,程序在通知崩溃报告器后仍会运行,并且在每次引擎或编辑器会话中仅报告一次。
| 宏 | 参数 | 行为 |
|---|---|---|
ensure() | 表达式 | 若表达式首次为false,通知崩溃报告器 |
ensureMsgf() | 表达式,格式化文本 | 若表达式首次为false,通知崩溃报告器并将格式化文本输出到日志 |
ensureAlways() | 表达式 | 若表达式为false,总是通知崩溃报告器 |
ensureAlwaysMsgf() | 表达式,格式化文本 | 若表达式为false,总是通知崩溃报告器并将格式化文本输出到日志 |
其中,这些宏在所有环境下计算表达式的值,但仅在Debug,Development,Test和Shipping Editor环境中通知崩溃报告器。