宏 GENERATED_UCLASS_BODY() 与 GENERATED_BODY() 简析
继承自UE4引擎的类会生成一些宏代码。 这此宏代码的作用就是帮助生成构造函数和相关成员函数
UCLASS()
class SECTION1_API ASUsableActor : public AActor
{
GENERATED_BODY()
public:
};
UCLASS()
class SURVIVALGAME_API ASUsableActor : public AActor
{
GENERATED_UCLASS_BODY()
public:
};
F12跳转到这两个宏的声明文件中
#define GENERATED_BODY() \
PRAGMA_DISABLE_DEPRECATION_WARNINGS \
public: \
ASUsableActor_RPC_WRAPPERS_NO_PURE_DECLS \
ASUsableActor_CALLBACK_WRAPPERS \
ASUsableActor_INCLASS_NO_PURE_DECLS \
ASUsableActor_ENHANCED_CONSTRUCTORS \
private: \
PRAGMA_POP
GENERATED_BODY() 会经过一系列的宏替换 最下边成员访问方式为 private: 也就是说紧随 GENERATED_BODY()之后而又没有显著更改成员访问方式,那么访问方式则为private
#define GENERATED_UCLASS_BODY() \
PRAGMA_DISABLE_DEPRECATION_WARNINGS \
public: \
ASUsableActor_RPC_WRAPPERS \
ASUsableActor_CALLBACK_WRAPPERS \
ASUsableActor_INCLASS \
ASUsableActor_STANDARD_CONSTRUCTORS \
public: \
PRAGMA_POP
而GENERATED_UCLASS_BODY() 后边声名的成员变量访问方式则为公有。
#define ASUsableActor_RPC_WRAPPERS
#define ASUsableActor_CALLBACK_WRAPPERS
这两个为空宏, 在C/C++ 中空宏会被空格替换 大多用来表示注释
GENERATED_UCLASS_BODY() 中的两个非空宏声明如下
#define ASUsableActor_INCLASS \
private: \
static void StaticRegisterNativesASUsableActor(); \
friend SECTION1_API class UClass* Z_Construct_UClass_ASUsableActor(); \
public: \
DECLARE_CLASS(ASUsableActor, AActor, COMPILED_IN_FLAGS(0), 0, Section1, NO_API) \
DECLARE_SERIALIZER(ASUsableActor) \
/** Indicates whether the class is compiled into the engine */ enum {IsIntrinsic=COMPILED_IN_INTRINSIC}; \
UObject* _getUObject() const { return const_cast<ASUsableActor*>(this); }
这几行主要是为类声明一些成员方法
#define ASUsableActor_STANDARD_CONSTRUCTORS \
/** Standard constructor, called after all reflected properties have been initialized */ \
NO_API ASUsableActor(const FObjectInitializer& ObjectInitializer); \
DEFINE_DEFAULT_OBJECT_INITIALIZER_CONSTRUCTOR_CALL(ASUsableActor) \
private: \
/** Private copy-constructor, should never be used */ \
NO_API ASUsableActor(const ASUsableActor& InCopy); \
public:
这里可以看到 声明了一个公有构造函数 和一个私有的拷贝构造函数, 公有构造函数参数为FObjectInitializer的引用常量。 而拷贝构造函数声明为私有,则表示拷贝构造函数不可用
下边两个是 GENERATED_BODY() 中引用的非空宏声明
#define ASUsableActor_RPC_WRAPPERS_NO_PURE_DECLS \
static inline void StaticChecks_Implementation_Validate() \
{ \
}
#define ASUsableActor_INCLASS_NO_PURE_DECLS \
private: \
static void StaticRegisterNativesASUsableActor(); \
friend SECTION1_API class UClass* Z_Construct_UClass_ASUsableActor(); \
public: \
DECLARE_CLASS(ASUsableActor, AActor, COMPILED_IN_FLAGS(0), 0, Section1, NO_API) \
DECLARE_SERIALIZER(ASUsableActor) \
/** Indicates whether the class is compiled into the engine */ enum {IsIntrinsic=COMPILED_IN_INTRINSIC}; \
UObject* _getUObject() const { return const_cast<ASUsableActor*>(this); }
#define ASUsableActor_ENHANCED_CONSTRUCTORS \
private: \
/** Private copy-constructor, should never be used */ \
NO_API ASUsableActor(const ASUsableActor& InCopy); \
public: \
DEFINE_DEFAULT_CONSTRUCTOR_CALL(ASUsableActor)
DEFINE_DEFAULT_CONSTRUCTOR_CALL 在VS中并没有跟踪到在何处如何声明, 根据字面解释应该是定义默认的构造函数,也就是最基本的构造函数。
同样拷贝构造函数不可用
通过以上分析可以认为 GENERATED_BODY()为我们生成默认构造函数, 而GENERATED_UCLASS_BODY() 为我们生成带有指定参数类型的构造函数
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!