-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Description
C/C++编程规范
基础代码规范
- 代码遵循Google C++ Style Guide (仅限独立项目,与其他项目集成的代码遵循对应风格)
- 代码应遵循通用编程规范
- 除此之外,还应遵循如下附加规范
文件
- 外部库的include采用引号,如
#include "gtest/gtest.h"
命名规范
- 宏定义应以项目名
PROJECTNAME_开头,其他设计全局命名空间冲突的场景类似,如脚本目录名可以以projectname-开头 - 注意拼写正确性,不推荐使用复杂单词
- 命名、日志等注意单次词性,动词名词不可混用
- 变量名,metrics等保留单位,提高可读性,如kMaxFileSizeMB,latency_ms等
数据类型
- 禁用C-style cast
- 使用
nullptr而非NULL - 严肃的精度敏感的代码,使用定长的整形,如
uint8_t,int64_t,而非int,unsigned long等 - auto使用原则是在不影响可读性(例如
auto v = function_hard_to_guess_its_return_type()不适合)的前提下减少代码量 - (仅适用于部分项目)除与外部接口交互(如pybind),使用
string_t而非std::string
指针使用
- 除需要明确说明的情况外,不能使用
new和delete关键字,应使用std::make_shared和std::make_unique - 不能滥用
shared_ptr,如不需要共享所有权,应使用unique_ptr或裸指针 - 不能滥用
unique_ptr,如不需要所有权的转移,考虑是否裸指针更合适(裸指针表示本身没有ownership),例如Klass k; Func(&k);
质量保证
- 新增模块须添加
-Werror -Wall -Wextra编译选项 - 代码覆盖率需要达标
- 外部函数(系统函数,外部库)的返回值原则上必须要检查错误码或异常
- 推荐使用详尽的参数检查,性能关键路径上可使用
DCHECK,非关键路径可使用CHECK - 保持Fail-Fast编程,尽可能完备的检查(不影响关键路径性能),尽可能早的Crash掉程序,并记录详细的信息
- CMakeLists文件中不宜使用glob,应手动添加所有文件,以避免难以追查的问题
- 原则上禁止使用全局非常量变量。即使是实现单例模式时采用static,但要了解其带来的不良后果(初始化和销毁的不确定性)
日志规范
- LOG(INFO)不宜过多,打印正常流程的关键事件
- VLOG(1)打印debug时重要的trace
- VLOG(2)以及以上打印需要仔细debug时的所需信息
- 大写字母开头,注意语法,单次拼写正确,不推荐使用复杂单词
- 考虑打印出来的格式是否便于阅读和grep过滤
性能相关
不进行Premature Optimization,但应杜绝处处不是瓶颈,处处是热点的编程习惯,例如
- 不创建多余的对象(参数传递,局部对象等)
- 避免循环内重操作(比如对象创建释放,动态内存申请释放)
- 其他待补充
C代码
-
应系统性的避免命名空间冲突,命名应遵循
ModuleName_FuncOrVarName或PROJECTNAME_MACRONAME的形式 -
尽可能的采用面向对象的设计
typedef struct { int x; } Klass; void MyLib_Klass_DoSomething(Klass *this, int args);
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels