Unreal Engine 编码规范
命名惯例
- 首字母大写,并且没有下划线
- 类型名前有额外的大写字母前缀,以区别于变量名
- T:模板类
- I:抽象类
- E:枚举类
- U:UObject派生类
- A:AActor派生类
- S:SWidget派生类
- b:bool类型变量
- F:结构体
examples:
可移植的C++代码
- TCHAR:Character
- uint8:unsigned bytes
- int8:signed bytes
- uint16:unsigned shorts (2 bytes)
- int16:signed shorts (2 bytes)
- uint32:unsigned ints (4 bytes)
- int32:signed ints (4 bytes)
- uint64:unsigned quad words (8 bytes)
- int64:signed quad words (8 bytes)
- PTRINT:可以容纳指针的整数
标准库
- memcpy():FMemory::Memcpy
- memset():FMemory::Memset
Const正确性
- 不打算修改的实参,用const指针或const引用
- 方法不修改对象,用const
- 循环不修改容器,用const迭代器
现代C++语法
- 断言:static_assert
- override & final ,有效且鼓励使用
- 使用nullptr而不是NULL
- 初始化应该明确变量类型,尽量不使用auto
移动构造
TArray、TMap、TSet、FString,用MoveTemp,相当于std::move。
第三方代码
修改引擎中使用的库代码时,用 “//@third party code” 做标记,并解释为什么做了更改。
代码格式化
- 括号不跨行
- else | else if 跨行
命名空间
- 新API放在UE命名空间内,eg. UE::Audio
- 不面向公共的API应放在Private命名空间内,eg. UE::Audio::Private
- 不要把using放在全局声明中,unity构建系统会出BUG
- 宏不能存在于命名空间中,应该以UE_作为前缀
物理依赖
- 文件名不应加上前缀;eg. Scene.cpp代替UScene.cpp。这使得使用Workspace Whiz或Visual Assist的Open File in Solution这样的工具变得很容易,因为它减少了识别所需文件所需的字母数量。
- 所有头文件都应该防止使用#pragma once指令进行多次包含。注意,我们使用的所有编译器都只支持一次#pragma。
- 能使用向前声明而不包含头文件就用
- 将大函数拆分为逻辑子函数。编译器优化的一个方面是消除常见的子表达式。你的函数越大,编译器就需要做更多的工作来识别它们。这将导致构建时间大大增加。
- 不要使用太多内联函数,因为即使在不使用它们的文件中,它们也会强制重新构建。内联函数应该只用于简单的访问器,当分析显示这样做有好处时。
Style
- 始终对字符串文字使用TEXT()宏。如果没有它,从字面量构造FString的代码将导致不希望看到的字符串转换过程。