断言

断言是一种工具,用于确认一段给定代码所依赖的假设。简单而言,它可确认指针不为 NULL;复杂而言,它可确认特定函数无法被重新进入。UE4 提供一系列宏,以执行这些类型的确认。它们为宏,以便在特定编译配置中进行译出(出于性能因素或因为最终版本中不需要它们)。在以下路径中可查看宏:

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

运行时断言宏有三种类型:停止执行、在调试版本中停止执行和不停止执行报告错误。第一种和第三种类型的编译取决于 DO_CHECK 定义。第二种类型的编译使用 DO_GUARD_SLOW 定义。如任意定义设为 0,宏将被禁用且不影响执行。

我们一起来看看断言宏的第一类。如断言不为 true,以下宏将全部停止执行。如在调试器中运行,断言将导致断点的出现,以便查看如何到达此点。

check(expression);

此宏执行表达式;如出现 false 的断言,将停止执行。在宏被编译到版本中后(DO_CHECK=1),才会执行表达式。这是 check() 宏的最简单形态。

范例:

check(Mesh != nullptr);

check(bWasInitialized && "Did you forget to call Init()?");

verify(expression);

启用 DO_CHECK 后,此宏的行为与 check() 完全相同。然而 DO_CHECK 被禁用后表达式仍然在执行。可使用它确认变量的指定符合假设。

范例:

verify((Mesh = GetRenderMesh()) != nullptr);

checkf(expression, ...);

checkf() 宏允许您将一个表达式断言为 true,并在调试时打印有帮助的额外信息。在编译行为方面,它和 check() 行为相同。

范例:

checkf(WasDestroyed, TEXT( "Failed to destroy Actor %s (%s)"), *Actor->GetClass()->GetName(), *Actor->GetActorLabel());

checkf( TCString::Strlen( Key ) >= KEYLENGTH( AES_KEYBITS ), TEXT( "AES_KEY needs to be at least %d characters" ), KEYLENGTH( AES_KEYBITS ) );

verifyf(expression, ...);

verify() 宏固定执行表达式,verifyf() 也是如此。和 checkf(); 一样,它通过额外的调试信息停止执行

范例:

verifyf(Module_libeay32, TEXT("Failed to load DLL %s"), *DLLToLoad);

checkCode(expression);

与通常的 check() 相比,该宏稍显复杂。该宏在执行一次的 do/while 循环中执行表达式。表达式被放置在标出其范围的 do/while 括号中。这在引擎中不常用,但如有需要也可使用。和一个标准 check() 宏相同,DO_CHECK 被禁用时此宏将编译出结果。不使用存在必需副作用的表达式,因为 DO_CHECK 被禁用时代码已移除。

范例:

checkCode( if( Object->HasAnyFlags( RF_PendingKill ) ) { UE_LOG(LogUObjectGlobals, Fatal, TEXT(“对象 %s 是被标记为 RF_PendingKill! 的根集的一部分”), *Object->GetFullName() ); } );

checkNoEntry();

此宏不接受表达式,用于标记从不执行的代码路径。

范例:

switch (MyEnum)

{

case MyEnumValue:

break;

default:

checkNoEntry();

break;

}

checkNoReentry();

checkNoReentry() 宏可防止调用重新进入一个给定函数。在只应被调用一次的函数上使用它,必须完成后方可再次被调用。

范例:

void NoReentry()

{

checkNoReentry();

}

checkNoRecursion();

执行和 checkNoReentry() 相同的检查,但使用能更清楚表达含义的命名。

范例:

int32 Recurse(int32 A, int32 B)

{

checkNoRecursion();

return Recurse(A - 1, B - 1);

}

unimplemented();

DO_CHECK 宏第一类中的最后一个宏用于标记在特定类上应被覆写或不应被调用的函数,因为此函数不包含实现。

范例:

class FNoImpl

{

virtual void DoStuff()

{

// 必须对此进行覆写

unimplemented();

}

};

启用 DO_GUARD_SLOW 后,断言宏的第二类才会执行。DO_GUARD_SLOW 通常只在调试版本中启用,但也可针对项目进行修改。它们的运行较为缓慢,在开发或发布版本中不需要进行许多无谓的检查。这些宏的执行与较快的宏并无差异。这些宏是 checkSlow()、checkfSlow() 和 verifySlow()。

范例:

checkSlow(List->HasCycle());

checkfSlow(Class->IsA(AActor::StaticClass()), TEXT("Class (%s) is wrong type"), Class->GetName());

verifySlow(LastValue == Current);

运行时断言的最终类不会停止执行,它用于创建一个调用堆栈报告,帮助追踪问题。这些宏中的表达式固定被执行,并可被放置在条件语句中。这些宏可通过 DO_CHECK 定义启用。

ensure(expression);

确认表达式,以及引导到此点调用堆栈的生成是否失败。

范例:

if (ensure( InObject != NULL ))

{

InObject->Modify();

}

ensureMsg(expression, message);

确认表达式并生成一个带额外信息的调用堆栈(作为报告的部分)。

范例:

ensureMsg(Node != nullptr, TEXT("Node is invalid"));

ensureMsgf(expression, message, ...);

确认表达式并包含带生成报告调用堆栈的更多信息。和 checkf() 或 verifyf() 相同,包括上下文信息有助于追踪问题。

范例:

if (ensureMsgf(!bModal, TEXT("Could not create dialog because modal is set to (%d)"), int32(bModal)))

{

...

}

java断言与断点_断言 - 游戏蛮牛 - Unreal中文翻译用户手册相关推荐

  1. Java 基础语法 + 常见缩写单词全称(含中文翻译)

    1. 一些缩写单词的全称(含中文翻译) IDE - Integrated Development Environment 集合开发环境 XML -- Extensible Markup Languag ...

  2. java 贪吃蛇 控制台_控制台游戏贪吃蛇Java版

    无心间看到的一个贪吃蛇的控制台小游戏,起初只是想copy下来玩玩,没想里面有不少小问题,就顺手解决,固然仍是不完美,可是也勉强能玩了.java import java.util.LinkedList; ...

  3. java怎么绘画坦克_坦克游戏教程一:使用java绘图功能绘制简单坦克

    时间紧张,直接贴代码: /* * Function: TankGame 1.0 * Draw Tank */ package com.test1; import javax.swing.*; impo ...

  4. java五子棋技术路线_五子棋游戏程序设计(VB)

    匿名用户 1级 2013-07-19 回答 五子棋的AI构想 有句话叫"当局者迷,旁观者清.",但这句话在由AI所控制的计算机玩家上是不成立的,因为计算机必须知道有那些获胜方式,并 ...

  5. idea设置中文界面_英雄联盟手游中文翻译--游戏主页设置界面翻译

    英雄联盟手游B测已经开启有一段时间了,此次的测试资格发放数量极多,不知道有没有抢到测试资格呢? 当然目前阶段的测试暂时还是没有中文语言的.熊猫特地为大家带来了英雄联盟手游主页和常用设置页面的翻译. 后 ...

  6. 友益文书类似软件_团队成员分享 | 港中文翻译学姐:硬件不够,软件来凑;心之所愿,无所不能...

    B学姐 硬件不行的同学一定要努力提高自己对申请专业上的实习经验.饱腹诗书不够,也要有亲身实践后的体悟,这很加分.多对该行业背景现状进行思考,老师都喜欢有思想的学生,在后期面试也会给你带来惊喜. 在读专 ...

  7. java倜傥_Javan[贾万,贾范,爪哇]的中文翻译及英文名意思

    Javan常见英文名音译是贾万,贾范,爪哇.Javan代表是然而,所有的字母加在一起就成了"泥人"的意思,是个男士用的英文名字,历史上最早出现于希伯来语.希腊语,Javan是个霸气 ...

  8. java断言是什么_Java断言

    断言的概念 断言用于证明和测试程序的假设,比如"这里的值大于 5". 断言可以在运行时从代码中完全删除,所以对代码的运行速度没有影响. 断言的使用 断言有两种方法:一种是 asse ...

  9. java断言是什么_Java断言机制

    断言概述: J2SE 1.4 在语言上提供了一个新特性,就是 assertion 功能,他是该版本在 Java 语言方面最大的革新.从理论上来说,通过 assertion 方式可以证明程序的正确性,但 ...

  10. python猜拳游戏三局两胜制_猜拳游戏三局两胜------java实现代码

    package com.javasm.exerices02; import java.util.ArrayList; import java.util.List; import java.util.R ...

最新文章

  1. 笑出腹肌的注释,都是被代码耽误的诗人!
  2. Python 进阶 — 面向对象编程
  3. Visio studio 2019中opencv 4.1.1运行环境配置(亲测可用)
  4. Bit Manipulation —— 位运算
  5. AWS re:Invent大会回顾
  6. IOS开发学习----给表视图设置缩进级别
  7. 如何使用Hue上创建一个完整Oozie工作流
  8. vue2 怎么用vite_vite快速入门教程
  9. 加密狗映射至虚拟服务器,XenServer6.x U盘、加密狗等USB设备映射到VM虚拟机教程.pdf...
  10. linux压缩文件命令_Linux 系统压缩和解压 zip 格式文件
  11. LPCTSTR的用法
  12. 本地服务器模板网站怎么安装,使用dedecms搭建自己的本地网站(全程图解)
  13. 湖南发现外星智慧创造人类证据(图)
  14. 学编程脚本 android,Auto.js安卓免root脚本开发教程
  15. 年年立计划却年年倒?用对计划管理工具是关键
  16. VVC变换编码(一)MTS
  17. 一位25岁的董事长给大学生的18条忠告
  18. 2008年下半年软件水平考试程序员试题分析
  19. oracle sun小机处理器,浅析IBM、HP和Sun新一代小型机竞争格局
  20. 反相放大器和同相放大器的过程和区别及选择方式概述

热门文章

  1. VNPY量化交易(一)
  2. 简易矩阵乘法计算器2.0
  3. html5好看的注册页面设计,美观大气注册登录页面模板html源码
  4. 数控数据采集跨平台免授权扎克(mazak)西门子(Siemens)海德汉(heidenhain)广数(GSK)、凯恩帝(knd)、三菱、海德汉、兄弟、哈斯、宝元、新代、发那科(Fanuc)、华中
  5. java生成多页pdf_java 多页pdf转化为多张图片
  6. 关于金融学和计量金融学的好书
  7. Oracle EMCC 12c emcli命令行工具安装以及使用介绍
  8. 《AP音频分析仪的使用》
  9. Android-Binder机制
  10. 计算机应不应该学电路,应该怎么学才能入门电子技术