1.7 KiB
Raw Blame History

NoExport

  • 功能描述: 指定UHT不要用来自动生成注册的代码而只是进行词法分析提取元数据。

  • 引擎模块: UHT

  • 元数据类型: bool

  • 作用机制: 在ClassFlags中增加EClassFlags: CLASS_NoExport

  • 常用程度: 0

指定UHT不要用来自动生成注册的代码而只是进行词法分析提取元数据。

引擎的NoExportTypes.h里大量都是这种类型专门提供给UHT来提取信息的。一般会用#if !CPP //noexport class来包裹来避免编译。同时在另一个地方会定义这个类。因为StaticRegisterNatives##TClass没有生成所以GetPrivateStaticClass不能调用成功所以不能NewObject。一般noexport和Intrinsic都是配合使用的。因为DECLARE_CLASS_INTRINSIC内部会声明static void StaticRegisterNatives##TClass() {} 来允许成功调用。

引擎里的结构倒是经常用noexport来阻止生成UHT注册。因为结构其实不需要调用GetPrivateStaticClass来创建元数据。只要有Z_Construct_UScriptStruct_XXX来生成构造相应的UScriptStruct对象就行。

测试代码:

UCLASS(noexport)
class INSIDER_API UMyClass_NoExport :public UObject
{
	GENERATED_BODY()
public:
};

测试结果:

编译的时候生成错误:
error LNK2019: unresolved external symbol "private: static void __cdecl UMyClass_NoExport::StaticRegisterNativesUMyClass_NoExport(void)" (?StaticRegisterNativesUMyClass_NoExport@UMyClass_NoExport@@CAXXZ) referenced in function "private: static class UClass * __cdecl UMyClass_NoExport::GetPrivateStaticClass(void)" (?GetPrivateStaticClass@UMyClass_NoExport@@CAPEAVUClass@@XZ)