宏 GENERATED_UCLASS_BODY() 与 GENERATED_BODY() 简析
2016-01-15 16:11
323 查看
继承自UE4引擎的类会生成一些宏代码。 这此宏代码的作用就是帮助生成构造函数和相关成员函数
F12跳转到这两个宏的声明文件中
GENERATED_BODY() 会经过一系列的宏替换 最下边成员访问方式为 private: 也就是说紧随 GENERATED_BODY()之后而又没有显著更改成员访问方式,那么访问方式则为private
而GENERATED_UCLASS_BODY() 后边声名的成员变量访问方式则为公有。
这两个为空宏, 在C/C++ 中空宏会被空格替换 大多用来表示注释
GENERATED_UCLASS_BODY() 中的两个非空宏声明如下
这几行主要是为类声明一些成员方法
这里可以看到 声明了一个公有构造函数 和一个私有的拷贝构造函数, 公有构造函数参数为FObjectInitializer的引用常量。 而拷贝构造函数声明为私有,则表示拷贝构造函数不可用
下边两个是 GENERATED_BODY() 中引用的非空宏声明
DEFINE_DEFAULT_CONSTRUCTOR_CALL 在VS中并没有跟踪到在何处如何声明, 根据字面解释应该是定义默认的构造函数,也就是最基本的构造函数。
同样拷贝构造函数不可用
通过以上分析可以认为 GENERATED_BODY()为我们生成默认构造函数, 而GENERATED_UCLASS_BODY() 为我们生成带有指定参数类型的构造函数
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() 为我们生成带有指定参数类型的构造函数
相关文章推荐
- Search Engine XSS Worm
- 解决Default storage engine (InnoDB) is not available导致mysql无法启动的修改办法
- McAfee Anti-Virus Scanning Engine 5.2.00 RC
- 关于query Javascript CSS Selector engine
- 第三章 实现Eclipse Android与J2me平台切换
- 第三章 实现Eclipse Android与J2me平台切换(下)
- 深入浅出PHP(Exploring PHP)
- 利用Nginx 实现负载均衡代理(有图有真相)
- infobright初步评测
- Zoom to Selected Globe Features
- Engine 实现要素选取的方法(转载)
- Engine 实现要素选取的方法(转载)
- 批量将mysql库中是myisam引擎的表转成innodb
- 提高mysql插入数据的速度
- navicat开mysql数据库报1030-Got error 28 from ···
- Mac下 IntelliJ IDEA 12 建立python 项目时 google app e...
- Citrus Engine 学习笔记 第一弹 入口类和引擎demo
- mysql5.5碰到的type= MyISAM报错问题
- 用Unreal开发一个简单的MC Demo (1)
- PowerDesigner中设置MySql中的建表字符集