Skip to the content.

UE4 断言(搬运)

原文 https://zhuanlan.zhihu.com/p/64462945

Source

Runtime/Core/Public/Misc/AssertionMacros.h

在读断言代码之前先需要注意两个宏, “DO_CHECK” & “DO_GUARD_SLOW”

在Runtime\Core\Public\Misc\Build.h读到以下默认信息: 

DO_CHECK=1 只在打包时跟随USE_CHECKS_IN_SHIPPING的设置

DO_GUARD_SLOW=0 只在debug模式为1

三种类型的断言  
1. 停止执行 (check族)
	表达式为false即立刻中断,引擎崩溃  
2. Debug(DO_GUARD_SLOW=1)时停止执行 (checkSlow族)
	仅在Debug模式下崩溃
3. 不停止执行 (ensure族)  
	不会中断 但会生成callstack报告供debugensure会返回bool型结果
// -----------类型1--------------
// DO_CHECK=1才执行exp
// 人话: SHIPPING版本可能不执行exp
check(exp);

// DO_CHECK=1时和check一样 但DO_CHECK=0时还是会执行exp
// 人话: 和check一样,但保证执行exp
verify(exp);

// 人话: 和check, verify完全一样。 后面加的是断言失败可以print出来的调试信息
checkf(exp, ...);
verifyf(exp, ...);

// 人话: 这特么根本不是断言
// 实现是 do { exp; } while ( false );
// 建议别用
checkCode(exp);

// 没有参数 用来标记不应该运行到的代码 只DO_CHECK=1有效
// 人话: 放到运行到就代表出错的地方,比如switch的default
checkNoEntry();

// 被用来防止重入/防止递归 用它来防止一个函数被调用了第二次 只DO_CHECK=1有效
// 人话: 放到不想进入第二次/不想让它递归的函数开头
checkNoReentry(); 
checkNoRecursion();

// 用来防止想要被子类重写的虚函数在父类被调用
// 人话: 建议用纯虚函数代替
unimplemented();

// -----------类型2--------------
// 只在DO_GUARD_SLOW=1时运行这些函数 功能和上面对应的完全一致
checkSlow(exp);
checkfSlow(exp);
verifySlow(exp);

// -----------类型3--------------
// DO_CHECK=1时exp为false则会打印堆栈 把exp布尔化一下返回 
// 人话: ensure可以帮你生成堆栈信息来调试
ensure(exp);

// 这个API官方4.9版本文档还有 但4.20版本代码中已经删去了
// 人话: 别用
ensureMsg(exp, msg);

// 人话: 在ensure基础上加上自定义msg供调试
ensureMsgf(exp, msg, ...);