UE_C++ —— Asserts
目录一Check二Verify三Ensure四Usage Examples在C和C编程中assert可在开发期间帮助检测和诊断不正常或无效的运行时条件这些条件通常检查是否指针为非空、除数为非零、函数并非递归运行或代码要求的其他重要假设但每次检查会使得效率十分低下某些情况下assert会在延迟崩溃发生之前发现导致该崩溃的bug如删除未来tick所需的对象协助开发人员发现引起崩溃的根本原因assert的关键特性之一是不存在于发布代码中这意味着不但不会影响发布产品的性能也没有任何副作用对assert最简单的理解就是断言必须一律为true否则程序会停止运行引擎提供assert等同项的三个不同族系check、verify和ensure若要检查这些功能背后的代码可在Engine/Source/Runtime/Core/Public/Misc/AssertionMacros.h中找到相关的宏各个功能的行为略有不同但它们都是开发期间使用的诊断工具目标大致相同一CheckCheck族系最接近基础assert因为当第一个参数得出的值为false时此族系的成员会停止执行且默认不会在发布版本中运行MacroParametersBehaviorcheckorcheckSlowExpression若Expression为false停止执行checkf或checkfSlowExpression、FormattedText、...若Expression为false则停止执行并将FormattedText输出到日志checkCodeCode在运行一次的do-while循环结构中执行Code主要用于准备另一个Check所需的信息;checkNoEntry/若此行被hit则停止执行类似于check(false)但主要用于不可到达的代码路径checkNoReentry/若此行被hit超过一次则停止执行checkNoRecursion/若此行被hit超过一次而未离开作用域则停止执行unimplemented/若此行被hit则停止执行类似于check(false)但主要用于应被覆盖而不会被调用的虚拟函数检查宏仅在调试Debug、开发Development版本中运行Slow宏仅在调试Debug版本中运行设置USE_CHECKS_IN_SHIPPING1可使Check宏在测试Test和发布编辑器Shipping Editor版本中运行此法在以下情况中十分实用怀疑Check宏中的代码正在修改值发现了仅存在于在发布版本中且难以追踪的bug但认为现有Check宏能找到这些bug项目发布时应将USE_CHECKS_IN_SHIPPING设为默认值0二Verify在大部分版本中Verify族系的行为与Check族系相同但即便在禁用Check宏的版本中Verify宏也会计算其表达式的值意味着仅当该表达式需要独立于诊断检查之外运行时才应使用Verify宏如若某个函数执行操作然后返回bool来说明该操作是否成功则应使用Verify而非Check来确保该操作成功因为在发布版本中Verify将忽略返回值但仍将执行操作而Check在发布版本中根本不调用该函数所以行为才会有所不同MacroParametersBehaviorverifyorverifySlowExpression若Expression为false停止执行verifyforverifyfSlowExpression、FormattedText、...若Expression为false则停止执行并将FormattedText输出到日志验证宏在调试Debug、开发Development、测试Test和发布编辑器Shipping Editor版本中完整运行以Slow结尾的宏除外其仅在调试Debug版本中运行定义USE_CHECKS_IN_SHIPPING来保留一个true值通常为1从而覆盖此行为在所有其他情况下Verify宏将计算其表达式但不会停止执行或将文本输出到日志三EnsureEnsure族系类似于Verify族系但可在出现非致命错误时使用这意味着若Ensure宏的表达式计算得出的值为false引擎将通知崩溃报告器但仍会继续运行为避免崩溃报告器收到太多通知Ensure宏在每次引擎或编辑器会话中仅报告一次若实际情况需要Ensure宏在每次表达式计算得值为false时都报告一次则使用Always版本的宏MacroParametersBehaviorensureExpressionExpression首次为false时通知崩溃报告器ensureMsgfExpression、FormattedText、...Expression首次为false时通知崩溃报告器并将FormattedText输出到日志ensureAlwaysExpressionExpression为false时通知崩溃报告器ensureAlwaysMsgfExpression、FormattedText、...Expression 为false时通知崩溃报告器并将 FormattedText 输出到日志Ensure宏在所有版本中计算其表达式的值但仅在调试Debug、开发Development、测试Test和发布编辑器Shipping Editor版本中联系崩溃报告器四Usage Examples以下假设情况展示了一些用例其中Check、Verify和Ensure可帮助理清代码或协助调试// 决不可使用空JumpTarget调用此函数若发生此情况须停止程序 void AMyActor::CalculateJumpVelocity(AActor* JumpTarget, FVector JumpVelocity) { check(JumpTarget ! nullptr); // 计算在JumpTarget上着陆所需的速度现在可确定JumpTarget为非空 }// 这行代码捕获了在产品发布版本中可能出现的小错误 // 此错误较小无需停止执行便可解决 // 虽然该bug已修复但开发者仍然希望了解之前是否曾经出现过此bug void AMyActor::Tick(float DeltaSeconds) { Super::Tick(DeltaSeconds); // 确保bWasInitialized为true然后再继续若为false则在日志中记录该bug尚未修复 if (ensureMsgf(bWasInitialized, TEXT(%s ran Tick() with bWasInitialized false), *GetActorLabel())) { // 执行一些需要已正确初始化AMyActor的操作 } }// 若添加新形状类型但忘记在此切换块中处理则此代码将停止 switch (MyShape) { case EShapes::S_Circle: //处理圆圈。 break; case EShapes::S_Square: //处理方块。 break; default: // 每种形状类型都应有相应情况因此这种情况不应该发生 checkNoEntry(); break; }// 此UObject拥有测试函数IsEverythingOK没有副作用若出现问题则返回false // 若发生这种情况将出现致命错误并终止 // 因为代码无副作用仅作诊断之用因此无需在发布版本中运行 checkCode( if (!IsEverythingOK()) UE_LOG(LogUObjectGlobals, Fatal, TEXT(Something is wrong with %s!Terminating.), *GetFullName()); );// 此列表中不应有圆圈若有程序将停转但检查圆圈耗时较长因此建议在调试版本中操作 checkSlowf(!MyLinkedList.HasCycle(), TEXT(Found a cycle in the list!)); // 遍历列表在各个元素上运行一些代码

相关新闻

3个关键问题:如何用智能PDF分类工具提升文档处理效率?

3个关键问题:如何用智能PDF分类工具提升文档处理效率?

3个关键问题:如何用智能PDF分类工具提升文档处理效率? 【免费下载链接】pdf-inspector Fast Rust library for PDF inspection, classification, and text extraction. Intelligently detects scanned vs text-based PDFs to enable smart routing decis…

2026/8/6 23:03:06 阅读更多 →
程序员一天省出 3 小时?实测 2026 最火的开源 AI 编程平台 MonkeyCode

程序员一天省出 3 小时?实测 2026 最火的开源 AI 编程平台 MonkeyCode

从"补全代码"到"替你干活":AI 编程的范式转移2026 年,AI 编程已经不再是"自动补全函数"这种小打小闹。随着 DeepSeek V4 等国产大模型接连发布,AI 从"助手"进化成了真正能独立执行任务的 Agent。而在…

2026/8/6 23:02:20 阅读更多 →
DeepSeek 深度解析:国产开源大模型的崛起之路

DeepSeek 深度解析:国产开源大模型的崛起之路

一、什么是 DeepSeekDeepSeek(深度求索)是由幻方量化旗下的深度求索公司推出的开源大语言模型系列。自 2023 年发布以来,DeepSeek 凭借其卓越的推理能力、低廉的训练成本和完全开源的策略,迅速在全球 AI 领域引发广泛关注。二、核…

2026/8/6 23:01:32 阅读更多 →

最新新闻

EtherCAT可以用电容式Chip LAN吗

EtherCAT可以用电容式Chip LAN吗

EtherCAT可以用电容式Chip LAN吗 在EtherCAT硬件设计中,常见的100BASE-TX接口由PHY、网络变压器、共模电感和连接器组成。网络变压器负责信号耦合及直流隔离,共模电感负责抑制共模干扰。那么,能否去掉传统变压器,改用电容式Chip …

2026/8/7 0:19:29 阅读更多 →
耦合电感引脚编号不同,能直接改吗?

耦合电感引脚编号不同,能直接改吗?

耦合电感引脚编号不同,能直接改吗?在对比两款四引脚耦合电感时,经常会遇到一种情况:外形、焊盘位置和绕组结构看起来相同,但规格书中的引脚编号却不一样。这是否意味着产品不能替换?答案是:不一…

2026/8/7 0:19:29 阅读更多 →
光伏1500V电源变压器与PoE电源变压器有什么区别?

光伏1500V电源变压器与PoE电源变压器有什么区别?

光伏1500V电源变压器与PoE电源变压器有什么区别?光伏1500V辅助电源变压器和PoE电源变压器都属于高频开关电源磁性器件,也可能采用反激拓扑,但两者的输入电压、绝缘设计和应用环境完全不同,不能因为输出都是12V就互相替代。一、输入…

2026/8/7 0:19:29 阅读更多 →
嵌入式软件测试——单元测试用例爆炸问题分析与应对策略

嵌入式软件测试——单元测试用例爆炸问题分析与应对策略

1. 引言:嵌入式单元测试的独特挑战在嵌入式软件开发中,单元测试是保证代码质量、发现早期缺陷的关键环节。然而,与通用软件不同,嵌入式系统因其硬件依赖性强、资源受限、实时性要求高等特点,使得单元测试面临一个普遍且…

2026/8/7 0:19:29 阅读更多 →
用 Cherry Studio 接入 Ace Data Cloud:一个 Token 打通 Claude、GPT、Gemini、DeepSeek 等主流模型

用 Cherry Studio 接入 Ace Data Cloud:一个 Token 打通 Claude、GPT、Gemini、DeepSeek 等主流模型

用 Cherry Studio 接入 Ace Data Cloud:一个 Token 打通 Claude、GPT、Gemini、DeepSeek 等主流模型 如果你经常在本地使用 AI 客户端,应该对 Cherry Studio 不陌生。它是一款开源、多平台的多模型 AI 桌面客户端,支持 Windows、macOS、Linux…

2026/8/7 0:17:28 阅读更多 →
专科自考成人教育论文查AI率吗?要求和全日制不一定一样,问清这几件事。

专科自考成人教育论文查AI率吗?要求和全日制不一定一样,问清这几件事。

专科自考成人教育论文查AI率吗?要求和全日制不一定一样,问清这几件事。 你可能已经找了两三天了。搜"论文 AI 检测",出来的全是全日制研究生和本科生在讨论,说的是学校统一送检、导师催、学院群里通知。你这边呢&#x…

2026/8/7 0:16:28 阅读更多 →

日新闻

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南 【免费下载链接】scrcpy Display and control your Android device 项目地址: https://gitcode.com/GitHub_Trending/sc/scrcpy 想要将Android手机屏幕完美投射到电脑上,享受大屏操作的自…

2026/8/7 0:00:19 阅读更多 →
如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南

如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南

如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南 【免费下载链接】tom-select Tom Select is a lightweight (~16kb gzipped) hybrid of a textbox and select box. Forked from selectize.js to provide a framework agnostic autocomplete widget wi…

2026/8/7 0:00:19 阅读更多 →
5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件

5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件

5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件 【免费下载链接】nsz NSZ - Homebrew compatible NSP/XCI compressor/decompressor 项目地址: https://gitcode.com/gh_mirrors/ns/nsz 你是否在为Nintendo Switch游戏文件占用大量存储…

2026/8/7 0:00:19 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/6 22:02:27 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/6 22:02:27 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/6 22:02:27 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/5 23:28:39 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/6 22:02:28 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/5 23:46:51 阅读更多 →