Skip to content

C/C++编程规范 #15

@AlexZ33

Description

@AlexZ33

C/C++编程规范

基础代码规范

文件

  1. 外部库的include采用引号,如#include "gtest/gtest.h"

命名规范

  1. 宏定义应以项目名PROJECTNAME_开头,其他设计全局命名空间冲突的场景类似,如脚本目录名可以以projectname-开头
  2. 注意拼写正确性,不推荐使用复杂单词
  3. 命名、日志等注意单次词性,动词名词不可混用
  4. 变量名,metrics等保留单位,提高可读性,如kMaxFileSizeMB,latency_ms等

数据类型

  1. 禁用C-style cast
  2. 使用nullptr而非NULL
  3. 严肃的精度敏感的代码,使用定长的整形,如uint8_tint64_t,而非int, unsigned long
  4. auto使用原则是在不影响可读性(例如auto v = function_hard_to_guess_its_return_type()不适合)的前提下减少代码量
  5. (仅适用于部分项目)除与外部接口交互(如pybind),使用string_t而非std::string

指针使用

  1. 除需要明确说明的情况外,不能使用newdelete关键字,应使用std::make_sharedstd::make_unique
  2. 不能滥用shared_ptr,如不需要共享所有权,应使用unique_ptr或裸指针
  3. 不能滥用unique_ptr,如不需要所有权的转移,考虑是否裸指针更合适(裸指针表示本身没有ownership),例如
      Klass k;
      Func(&k);

质量保证

  1. 新增模块须添加-Werror -Wall -Wextra编译选项
  2. 代码覆盖率需要达标
  3. 外部函数(系统函数,外部库)的返回值原则上必须要检查错误码或异常
  4. 推荐使用详尽的参数检查,性能关键路径上可使用DCHECK,非关键路径可使用CHECK
  5. 保持Fail-Fast编程,尽可能完备的检查(不影响关键路径性能),尽可能早的Crash掉程序,并记录详细的信息
  6. CMakeLists文件中不宜使用glob,应手动添加所有文件,以避免难以追查的问题
  7. 原则上禁止使用全局非常量变量。即使是实现单例模式时采用static,但要了解其带来的不良后果(初始化和销毁的不确定性)

日志规范

  1. LOG(INFO)不宜过多,打印正常流程的关键事件
  2. VLOG(1)打印debug时重要的trace
  3. VLOG(2)以及以上打印需要仔细debug时的所需信息
  4. 大写字母开头,注意语法,单次拼写正确,不推荐使用复杂单词
  5. 考虑打印出来的格式是否便于阅读和grep过滤

性能相关

不进行Premature Optimization,但应杜绝处处不是瓶颈,处处是热点的编程习惯,例如

  1. 不创建多余的对象(参数传递,局部对象等)
  2. 避免循环内重操作(比如对象创建释放,动态内存申请释放)
  3. 其他待补充

C代码

  1. 应系统性的避免命名空间冲突,命名应遵循ModuleName_FuncOrVarNamePROJECTNAME_MACRONAME的形式

  2. 尽可能的采用面向对象的设计

    typedef struct {
      int x;
    } Klass;
    
    void MyLib_Klass_DoSomething(Klass *this, int args);

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions