基于google升级版c++代码规范指南

2023-11-20

有些团队所有成员写的代码都一致,10个人写的代码像1个人写的。正因为有代码规范,使得代码可读性强,方便代码review,利于后期维护。这体现了代码规范的重要性。接下来,在参考google的代码规范基础上,详细列举代码规范细节。

1、文件描述

文件描述放在源文件或头文件顶部,包括:版权所有者、遵循协议、作者、功能介绍

// Copyright
// License
// Author
// Description

2、include头文件

(1) 本类的头文件(放在首位,可减少依赖)

(2) C语言系统文件

(3) C++语言系统文件

(4) 其他库头文件

(5) 本项目其他头文件

(6) 系统头文件使用<xx.h>,其他头文件使用“xx.h”

3、文件命名

(1) 源文件命名全部小写,以下划线连接:file_manager.cpp

(2) 头文件命名全部大写,以下划线连接:

#ifndef FILE_MANAGER_H_
#define FILE_MANAGER_H_

......

#endif // FILE_MANAGER_H_

4、类命名

类名首字母大写:class FileManager

接口命名以Interface结束

5、函数命名

普通函数首字母大写:void Read(char* buf, int buf_size)

函数参数,全部小写,下划线连接

6、变量与常量命名

成员变量以下划线结尾:file_length_(也有存在以m开头的写法)

静态变量以s开头:sFileLength

全局变量以g开头:gFileLength

常量以k开头:kFileLength

变量、常量、函数命名需要详细,禁止数字、首字母缩写,尽量做到见名知意、详细命名。

7、命名空间

命名空间全部小写

禁止使用using namespace xxx,避免污染命名空间

可以在源文件使用using,例如:using std::string

8、无符号类型

除了位运算,其他情况不使用无符号类型

9、尽量不使用exception

模块内部定义exception,其他模块依赖后,无法捕获未知exception。

另外,不要在析构函数抛出异常,而是捕获所有异常并处理。

10、RTTI

不要使用RTTI,单元测试可以使用

11、构造函数

构造函数只进行赋值初始化,尽量不执行耗时操作或具体方法;

explicit修饰单参构造函数,避免隐式类型转换误用;

成员变量在构造函数进行初始化;

仅在需要拷贝构造对象时,使用拷贝构造函数;

否则在private内部调用DISALLOW_COPY_AND_ASSIGN宏,或者定义不可copy与assign基类。

class Uncopyable {

protected:

    Uncopyable() {}

    ~Uncopyable() {}

private:

    Uncopyable(const Uncopyable&);

    Uncopyable& operator=(const Uncopyable&);

};

class Test : private Uncopyable {

    ......

};

12、作用域

尽量不要声明为全局变量,尽量不要把类成员变量暴露给外部访问。

函数尽量声明为private/protect,如果要声明public,也要避免被外部修改。

13、enum枚举

枚举名大写开头,枚举类型全部大写,下划线连接。

enum MediaType {

    MEDIA_TYPE_VIDEO = 0,

    MEDIA_TYPE_AUDIO,

    MEDIA_TYPE_SUBTITLE

}

14、大括号换行

函数最外层左括号不换行,右括号换行(也有写法左括号换行)

函数体内部左括号不换行,右括号换行

void Function() {
    if (condition) {
        ......
    }
}

15、条件判断语句

条件括号无空格,(condition)左右1个空格,if执行体为2或4空格缩进

if (condition) {
    for (int i = 0; i < 10; i++) {
        ......
    }
} else {
    ......
}

16、智能指针

(1)如果要需要动态分配,哪里分配对象哪里保持它的所有权。

如果其他代码需要访问该对象,考虑传递其副本,或者传递指针或引用,而不是转移对象所有权。

(2)如果要共享对象,使用std::share_ptr

(3)尽量不要使用std::auto_ptr,而使用std::unique_ptr

17、类型转换

使用显式类型转换,尽量不用c语言风格的强制类型转换

包括static_cast、const_cast、dynamic_cast、reinterpret_cast

18、sizeof

使用sizeof(name),而不用sizeof(type)

HelloStruct hello;

memset(hello, 0, sizeof(hello));

19、inline

使用inline内联函数,确保代码行数在10行内

20、const

不用修改的参数或函数,尽量使用const

bool IsRunning() const {
    return running_;
}

21、宏定义

(1)不要在.h头文件进行宏定义

(2)使用#define进行宏定义,用完后#undef

(3)尽量不用##来生成函数/类/变量名

22、代码行数

每行代码尽量不要超过80字符

23、参数对齐

属于建议部分,函数参数或者判断条件对齐

构造函数参数:

FileManager::FileManager()
    :name("test"),
     mode("rw") {
    ......
}

成员函数参数:

FileManager::Read(char* buf,
    long offset,
    int buf_size) {
    ......
}

判断条件:

if (condition1 &&
    condition2 &&
    condition3) {
    ......
}

变量赋值,等号对齐(整齐美观,不强制要求):

int one   = 1;

int two   = 2;

int three = 3;

24、注释

注释包括文件头注释、函数注释、结构体注释、接口注释、关键代码注释等。

代码注释使用 //,比如

// read buffer from stream

函数注释:

/**
 * @brief Read buffer from stream
 * @param buf  a buf to cache data
 * @param size how much data to read once a time
 * @return 0 for success, < 0 for fail
 * 
 **/
int Read(char* buf, int size) {

}

25、new和delete

 new和delete配对使用,原则上在哪里申请内存,在哪里释放(同一个对象里操作)。

创建数组使用new[],然后使用memset进行初始化,释放使用delete[]

26、const和define

尽量使用const或者enum代替define。

27、virtual虚函数

多态基类的析构函数声明为虚函数,避免无法调到派生类析构函数导致内存泄漏。

不要在构造函数或析构函数调用虚函数,内联函数、友元函数不要声明为虚函数。

参考文档:google版c++代码规范 

参考书本:<Effective C++>

                  <C++编程思想 / Thinking in C++>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于google升级版c++代码规范指南 的相关文章

随机推荐

  • 用C++写一个ChatGPT

    要用 C 语言写一个 ChatGPT 需要执行以下步骤 了解 ChatGPT 是什么 ChatGPT 是一种自然语言生成模型 能够在聊天场景中生成人类语言的文本 安装需要的软件 需要安装 C 语言编译器 如 GCC 或者 Visual C
  • 【C++从0到1】C++入门(上篇)类入门篇

    c 入门必看 前言 一 命名空间 二 缺省函数 三 函数重载 3 1常见使用 3 2重载底层实现 3 3返回值不纳入重载原因 四 extren C 五 引用 5 1常见使用 5 2临时变量的作用 5 3引用返回常见错误 5 4指针与引用 六
  • Golang 内存对齐视频

    https www bilibili com video BV1Ja4y1i7AF 简而言之 就是注意写代码的时候要把相同类型的元素放在一起 更进一步需要自己将结构体配对为32位或64位的整数倍 有助于减少额外空间消耗
  • java数据库实例_Java连接各种数据库的实例

    转自 CSDN此文中的代码主要列出连接数据库的关键代码 其他访问数据库代码省略 1 Oracle8 8i 9i数据库 thin模式 Class forName oracle jdbc driver OracleDriver newInsta
  • SQL修改表的列

    1 修改列的数据类型 要修改列的数据类型 请使用以下语句 ALTER TABLE table name ALTER COLUMN column name new data type size 新数据类型必须与旧数据类型兼容 否则 如果列具有
  • 程序员孔乙己

    软件园的格局自与别处是有所区别的 高矮不同的写字楼里 排列着整齐的格子间 放眼望去到处都是格子衫 双肩包 还有那稀疏的头发 园区每一栋大楼的入口处 都有一个超大前台 清洁的铮亮 散发着光芒 桌上零散的堆放着办公品 边上隔了一间咖啡馆 顺带售
  • background-position和雪碧图(CSS Sprites)用法

    background position属性使用频率非常高 大量的网站为了减少http请求数 会将大量的图片图片合成一张雪碧图 Sprite 来使用 雪碧图的使用就是通过控制background position属性值来确定图片呈现的位置 不
  • C++ StrCmpLogicalW文件名排序

    打开资源管理器 文件列表如下 搜索文件列表 include
  • Vue项目的部署(服务器)

    Vue项目的部署 服务器 前几天帮朋友写了一个可以动态查看地点温度的前端项目 目前已经部署上线了 访问链接点这里 服务器是朋友的 倒时候打不开会很正常 说不定又使用服务器玩大数据项目去了 效果图 图一 图二 当然 温度也都是实时跟新的 而且
  • MATLAB小技巧(20)矩阵分析--主成分回归

    MATLAB小技巧 20 矩阵分析 主成分回归 前言 一 MATLAB仿真 二 仿真结果 三 小结 前言 MATLAB进行图像处理相关的学习是非常友好的 可以从零开始 对基础的图像处理都已经有了封装好的许多可直接调用的函数 这个系列文章的话
  • maven的resources介绍

    在开发maven项目时 一般都会把配置文件放到src main resources目录下 针对这个目录 maven的resources对其进行单独的配置 resources配置一般如下
  • reactJS 干货(reactjs 史上最详细的解析干货)

    一 State和 Props state是状态机 应该包括 那些可能被组件的事件处理器改变并触发用户界面更新的数据 譬如需要对用户输入 服务器请求或者时间变化等作出响应 不应该包括 计算所得数据 React组件 在render 里使用pro
  • [echarts]echarts的canvas画布大小与容器大小不一致的解决方案

    div class wrap style width 300px height 300px div style width 100 height 100 div div 场景描述 如上所示布局 我的echarts容器大小设置的宽高都是100
  • 学习java笔记:实现家庭记账

    第一步 采用 Utility工具类 import java util Scanner Utility工具类 将不同的功能封装为方法 就是可以直接通过调用方法使用它的功能 而无需考虑具体的功能的实现 public class Utility
  • centos7-docker安装mysql5.7

    目录 1 docker 拉取mysql5 7镜像 2 创建实例并启动 3 查看容器是否启动成功 4 使用navicat 连接mysql 5 配置mysql 配置文件 6 重启容器 7 进入容器 1 docker 拉取mysql5 7镜像 d
  • 分布式集群管理—认知

    分布式集群管理 认知 分布式系统都是大规模机器的应用 所以需要管理大量的集群与机器 特别是云计算领域 部署管理系统 支持在大规模 多集群上进行分布式系统的部署 冷升级和热升级 进程的配置通过一个专门的配置中心进行推送 集群的配置中心 用于管
  • centos8安装rabbitmq(rpm包)

    1 先下载好rpm包 https pkgs org 1 检索rabbitmq下载对应centos8的版本 rabbitmq server 3 9 14 1 el8 noarch rpm 2 检索erlang下载对应centos8的版本 在官
  • delphi 后台截图

    function PrintWindow SourceWindow hwnd Destination hdc nFlags cardinal bool stdcall external user32 dll name PrintWindow
  • Windows slmgr.vbs 命令详解

    系统软件授权管理工具主要是用来查看系统的激活状态 以及密钥许可证等信息 在现在不在是使用 接参数了 现在 接参数 详解可以在cmd窗口输入slmgr vbs了解 常用参数 使用方式 再次提醒是使用 而不是 ipk 配合密钥使用 安装密钥 替
  • 基于google升级版c++代码规范指南

    有些团队所有成员写的代码都一致 10个人写的代码像1个人写的 正因为有代码规范 使得代码可读性强 方便代码review 利于后期维护 这体现了代码规范的重要性 接下来 在参考google的代码规范基础上 详细列举代码规范细节 1 文件描述