Google编程规范
### Google编程规范详解 #### 一、头文件 **1.1 #define保护** - **定义**: 所有头文件都应该使用`#define`来防止被多重包含。 - **命名格式**: `<PROJECT>_<PATH>_<FILE>_H_` - **示例**: 对于位于项目`foo`中路径`foo/src/bar/baz.h`的头文件,其`#define`保护应为: ```c++ #ifndef FOO_SRC_BAR_BAZ_H_ #define FOO_SRC_BAR_BAZ_H_ // 头文件内容... #endif // FOO_SRC_BAR_BAZ_H_ ``` **1.2 头文件依赖** - **推荐做法**: 尽可能使用前置声明而非`#include`。 - **示例**: 如果头文件只需要使用类`File`的名称(不需要访问其实现),则仅需前置声明: ```c++ class File; ``` 而无需`#include "file/base/file.h"`。 **1.3 内联函数** - **定义**: 内联函数是指编译器将函数体直接插入调用处的函数。 - **标准**: 只有当函数不超过10行时才应标记为内联。 - **优点**: 减少了函数调用开销,提高性能。 **1.4 -inl.h文件** - **解释**: 用于存放内联函数的具体实现。 **1.5 #include的路径及顺序** - **路径**: 使用相对路径而非绝对路径。 - **顺序**: 先本项目的头文件,再第三方库头文件,最后是标准库头文件。 #### 二、命名约定 **2.1 通用命名规则** - **大小写**: 遵循驼峰命名法(CamelCase)。 - **下划线**: 不允许使用。 **2.2 文件命名** - **示例**: `foo_bar.cc`、`foo_bar.h`。 - **原则**: 采用小写字母和下划线组合。 **2.3 类型命名** - **示例**: `FooBar`。 - **规则**: 首字母大写,后续每个单词首字母大写。 **2.4 变量命名** - **示例**: `foo_bar`。 - **规则**: 采用小写字母和下划线组合。 **2.5 常量命名** - **示例**: `kFooBar`。 - **规则**: 以`k`开头,采用大写字母和下划线组合。 **2.6 函数命名** - **示例**: `FooBar()`。 - **规则**: 遵循驼峰命名法。 **2.7 名字空间命名** - **示例**: `foo::bar`。 - **规则**: 采用双冒号分隔,遵循驼峰命名法。 **2.8 枚举命名** - **示例**: `kFooBar`。 - **规则**: 以`k`开头,采用大写字母和下划线组合。 **2.9 宏命名** - **示例**: `FOO_BAR`。 - **规则**: 全部采用大写字母和下划线组合。 #### 三、程序的版式 **3.1 行长度** - **标准**: 每行不超过80个字符。 **3.2 代码内的空格** - **示例**: 在括号前加空格。 **3.3 空行** - **用途**: 用于分隔不同的逻辑块。 **3.4 空格还是制表位** - **标准**: 一律使用空格。 **3.5 函数声明与定义** - **标准**: 分离声明和定义。 - **示例**: 头文件中声明,`.cc`文件中定义。 **3.6 函数调用** - **示例**: 参数之间用逗号分隔。 **3.7 条件语句** - **示例**: `if (x > y) { ... }`。 **3.8 循环和开关选择语句** - **示例**: `for (int i = 0; i < n; ++i) { ... }`。 **3.9 指针和引用表达式** - **示例**: `int *p;`、`int &r = x;`。 **3.10 布尔表达式** - **示例**: `bool result = (x > y);`。 **3.11 函数返回值** - **示例**: `return x > y;`。 **3.12 变量及数组初始化** - **示例**: `int x[3] = {1, 2, 3};`。 **3.13 预处理指令** - **示例**: `#include "foo.h"`。 **3.14 类格式** - **示例**: 包括类的成员函数和属性的组织形式。 **3.15 初始化列表** - **示例**: 构造函数使用初始化列表初始化成员变量。 **3.16 名字空间格式化** - **示例**: 明确使用`using namespace std;`。 #### 四、注释 **4.1 注释风格** - **示例**: 使用多行注释或单行注释。 **4.2 注释应准确** - **要求**: 注释内容应清晰且与代码匹配。 **4.3 文件注释** - **示例**: 文件头部的版权声明和作者信息。 **4.4 类注释** - **示例**: 类的功能概述。 **4.5 函数注释** - **示例**: 函数的输入输出说明。 **4.6 变量注释** - **示例**: 变量的作用和用途。 **4.7 实现注释** - **示例**: 特定实现细节。 **4.8 TODO注释** - **示例**: 待完成的任务。 #### 五、函数设计 **5.1 函数参数的规则** - **标准**: 参数列表清晰简洁。 **5.2 返回值的规则** - **示例**: 返回有意义的结果。 **5.3 函数内部实现的规则** - **示例**: 函数内部逻辑应保持简洁。 **5.4 其它建议** - **示例**: 函数应只做一件事。 **5.5 使用断言** - **示例**: 断言用于调试而非错误处理。 **5.6 引用与指针的比较** - **区别**: 引用必须指向一个已存在的对象,而指针可以为空。 #### 六、内存管理 **6.1 内存分配方式** - **示例**: 使用`new`或`malloc`。 **6.2 常见的内存错误及其对策** - **示例**: 双重释放问题的避免方法。 **6.3 指针与数组的对比** - **示例**: 数组名是常量指针。 **6.4 指针参数是如何传递内存的?** - **示例**: 指针作为函数参数传递地址。 **6.5 free和delete把指针怎么啦?** - **解释**: `free`和`delete`释放指针指向的内存。 **6.6 动态内存会被自动释放吗?** - **答案**: 不会,需手动释放。 **6.7 杜绝“野指针”** - **示例**: 避免使用未初始化的指针。 **6.8 有了malloc/free为什么还要new/delete?** - **原因**: `new`和`delete`支持C++特性,如构造函数和析构函数。 **6.9 内存耗尽怎么办?** - **示例**: 使用异常处理机制处理内存耗尽的情况。 **6.10 malloc/free的使用要点** - **示例**: 总是检查`malloc`的返回值。 **6.11 new/delete的使用要点** - **示例**: 配对使用`new`和`delete`。 #### 七、作用域 **7.1 名字空间** - **示例**: 使用`namespace`关键字。 **7.2 嵌套类** - **示例**: 定义在另一个类内的类。 **7.3 非成员函数,静态成员函数,和全局函数** - **示例**: 定义在类外部的函数。 **7.4 局部变量** - **示例**: 在函数内定义的变量。 **7.5 静态和全局变量** - **示例**: 生命期贯穿整个程序执行过程的变量。 #### 八、类 **8.1 构造函数与析构函数的起源** - **示例**: 构造函数负责初始化对象,析构函数负责清理资源。 **8.2 构造函数的初始化表** - **示例**: 使用初始化列表而非赋值语句。 **8.3 构造函数的职责** - **示例**: 设置初始状态。 **8.4 默认构造函数** - **示例**: 无参数的构造函数。 **8.5 构造和析构的次序** - **示例**: 成员变量的构造顺序。 **8.6 类String的构造函数与析构函数** - **示例**: String类的构造和析构过程。 **8.7 显式构造函数** - **示例**: 防止隐式转换。 **8.8 拷贝构造函数** - **示例**: 创建对象的副本。 **8.9 类String的拷贝构造函数与赋值函数** - **示例**: String类的拷贝构造函数和赋值操作符。 **8.10 如何在派生类中实现类的基本函数** - **示例**: 重写基类的虚函数。 **8.11 结构体VS类** - **示例**: 默认情况下结构体成员为公有,类为私有。 **8.12 继承** - **示例**: 创建子类。 **8.13 多重继承** - **示例**: 一个类继承多个父类。 **8.14 接口** - **示例**: 纯虚函数构成的抽象类。 **8.15 运算符重载** - **示例**: 重载运算符以支持特定类型的运算。 **8.16 存取控制** - **示例**: public、protected和private修饰符。 **8.17 声明顺序** - **示例**: 类成员的声明顺序。 **8.18 编写简短函数** - **示例**: 函数长度不宜过长。 #### 九、其他C++特性 **9.1 引用参数** - **示例**: 使用`&`创建引用。 **9.2 函数重载** - **示例**: 同一函数名不同参数列表。 **9.3 重载、覆盖与隐藏** - **示例**: 函数重载、重写与隐藏的区别。 **9.4 缺省参数** - **示例**: 函数参数可以设置默认值。 **9.5 变长数组和alloca()** - **示例**: 动态分配栈上的数组。 **9.6 友元** - **示例**: 访问类的私有成员。 **9.7 异常** - **示例**: 使用`try-catch`处理异常。 **9.8 运行时类型识别** - **示例**: `typeid`获取类型信息。 **9.9 类型转换** - **示例**: `static_cast`、`dynamic_cast`等。 **9.10 流** - **示例**: 输入输出流的操作。 **9.11 前置自增和自减** - **示例**: `++i`和`--i`。 **9.12 const的使用** - **示例**: 限定变量不可修改。 **9.13 整型** - **示例**: 使用`int32_t`等固定宽度整型。 **9.14 64位下的可移植性** - **示例**: 确保代码在不同平台上的正确性。 **9.15 预处理宏** - **示例**: 使用宏定义常量。 **9.16 0和NULL** - **示例**: 在C++11及以上版本中使用`nullptr`。 **9.17 sizeof** - **示例**: 获取类型或对象的大小。 **9.18 Boost库** - **示例**: 使用Boost库提供的功能。 #### 十、其他编程经验 **10.1 提高程序的效率** - **示例**: 优化算法复杂度。 **10.2 一些有益的建议** - **示例**: 遵循DRY(Don't Repeat Yourself)原则。 #### 十一、规则特例 **11.1 现有不合规范的代码** - **处理**: 针对历史遗留代码的特殊情况。 **11.2 Windows代码?** - **示例**: 考虑Windows平台的特定需求。 以上内容涵盖了Google编程规范的核心要素,包括但不限于头文件保护、依赖管理、命名规则、代码风格、注释规范、函数设计、内存管理、类的设计与实现等方面。这些规范有助于提高代码质量和可维护性,确保团队开发过程中的一致性和协同性。
剩余63页未读,继续阅读
- zcf0012015-05-08规范是编程的首要问题,值得大家学习
- i天空2014-04-08C++的 确实很全 赞
- lazying_bird2017-09-25很有参考价值,谢谢分享!
- 码儿颠2014-01-22感觉非常有帮助 很齐全
- 粉丝: 11
- 资源: 4
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- NSArgumentNullException如何解决.md
- VueError解决办法.md
- buvid、did参数生成算法
- tiny-cuda-cnn.zip
- 关于月度总结的PPT模板
- 手表品牌与型号数据集,手表型号数据
- 基于Java实现(IDEA)的贪吃蛇游戏-源码+jar文件+项目报告
- 数字按键3.2考试代码
- 颜色拾取器 for Windows
- 台球检测40-YOLO(v5至v11)、COCO、CreateML、Paligemma、TFRecord、VOC数据集合集.rar
- # 基于MATLAB的导航科学计算库
- Qt源码ModbusTCP 主机客户端通信程序 基于QT5 QWidget, 实现ModbusTCP 主机客户端通信,支持以下功能: 1、支持断线重连 2、通过INI文件配置自定义服务器I
- tesseract ocr 训练相关的环境部署包,包括jdk-8u331-windows-x64.exe、jTessBoxEditorFX-2.6.0.zip 等
- 好用的Linux终端管理工具,支持自定义多行脚本命令,密码保存、断链续接,SFTP等功能
- 大学毕业设计写作与答辩指南:选题、研究方法及PPT制作
- 小偏差线性化模型,航空发动机线性化,非线性系统线性化,求解线性系统具体参数,最小二乘拟合 MATLAB Simulink 航空发动机,非线性,线性,非线性系统,线性系统,最小二乘,拟合,小偏差,系统辨