宏 GENERATED_UCLASS_BODY() 与 GENERATED_BODY() 简析
来源:互联网 发布:windows徽标键与t 编辑:程序博客网 时间:2024/05/19 23:01
继承自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() 为我们生成带有指定参数类型的构造函数
0 0
- 宏 GENERATED_UCLASS_BODY() 与 GENERATED_BODY() 简析
- UE4 GENERATED_UCLASS_BODY 与 GENERATED_BODY 区别
- GENERATED_BODY vs GENERATED_UCLASS_BODY
- 深入理解UE4宏定义—— GENERATED_BODY
- UE4 C++的 GENERATED_BODY()作用
- UE4反射机制UCLASS() USTRUCT() GENERATED_BODY() UPROPERTY() UFUNCTION()
- UE4反射机制UCLASS() USTRUCT() GENERATED_BODY() UPROPERTY() UFUNCTION()
- 宏:#与##
- 指针与引用,宏与预处理,define与tpyedef
- 宏与预处理&函数与函数库
- 简析StringBuffer与StringBuilder
- 简析 JSON 中的{}与[]
- 简析Lock与synchronized
- 宏与宏函数
- 宏与125元
- 宏#与##介绍
- 内联函数 与 宏
- 宏与内联函数
- ImageLoader加载图片 默认方式和自定义方式
- android 自定义Toast
- linux 网络编程(加部分原创)
- VB.NET 实现DataGridView CheckBox列状态变更触发事件,获取其状态值
- Maven编译类文件常见错误解决方法
- 宏 GENERATED_UCLASS_BODY() 与 GENERATED_BODY() 简析
- 关于Linux内核网络架构书籍收集
- iOS开发判断身份证号是否合法
- 正则表达式笔记
- 学java心得体会
- django集成已有的数据库
- Android消息机制源码分析--Lopper,Handler,Message
- 系统调用
- 开发自动化运维管理平台