之前写了两篇UE中实现反射的文章分析,介绍了UE的反射基础概念和依赖的一些C++特性,本篇文章开始分析UE反射实现的具体流程。
C++标准中并没有反射的特性,UE使用的反射是基于标记语法和UHT扫描生成辅助代码来实现的一套机制,正如David Wheeler的那句名言一样:“All problems in computer science can be solved by another level of indirection”,UHT做的就是这样的事情,在真正执行编译之前分析标记代码并产生真正的C++代码,收集反射类型的元数据,供运行时之用。
UHT生成的代码内容很多,为了避免文章组织上的混乱,本篇文章主要讲GENERATED_BODY
/UFUNCTION
等反射标记通过UHT之后生成到generated.h
中的真正的C++代码。
UHT生成的代码分别在generated.h
和gen.cpp
中,generated.h
中的代码大多是定义了一些宏,用在所声明的类内通过编译器预处理来添加通用成员,gen.cpp
中的代码则是UHT基于反射标记生成的用来描述类反射信息的具体代码,genrated.h
和gen.cpp
也是为了声明和定义分离。