没有合适的资源?快使用搜索试试~ 我知道了~
C++ 是 Google 大部分开源项目的主要编程语言. 正如每个 C++ 程序员都知道的, C++ 有很多强大的特性, 但这种强大不可避免的导致它走向复杂,使代码更容易产生 bug, 难以阅读和维护.本指南的目的是通过详细阐述 C++ 注意事项来驾驭其复杂性. 这些规则在保证代码易于管理的同时, 高效使用 C++ 的语言特性.
资源推荐
资源详情
资源评论
Google C++编程风格指南
edisonpeng 整理 2009/3/25
目录
背景 ................................................................................................................................................3
头文件 ............................................................................................................................................4
作用域 ............................................................................................................................................8
类 ..................................................................................................................................................13
来自 的奇技..................................................................................................................20
其他特性...............................................................................................................................32
命名约定........................................................................................................................................32
注释................................................................................................................................................38
格式 ..............................................................................................................................................44
规则特例........................................................................................................................................57
背景
是 大部分开源项目的主要编程语言正如每个 程序员都知道的有很多强大的特性但这种强
大不可避免的导致它走向复杂,使代码更容易产生 难以阅读和维护
本指南的目的是通过详细阐述 注意事项来驾驭其复杂性这些规则在保证代码易于管理的同时高效使用 的
语言特性
风格亦被称作可读性也就是指导 编程的约定使用术语 “风格” 有些用词不当因为这些习惯远不止源代码文件
格式化这么简单
使代码易于管理的方法之一是加强代码一致性让任何程序员都可以快速读懂你的代码这点非常重要保持统一编程风格
并遵守约定意味着可以很容易根据 “模式匹配” 规则来推断各种标识符的含义创建通用必需的习惯用语和模式可以使
代码更容易理解在一些情况下可能有充分的理由改变某些编程风格但我们还是应该遵循一致性原则,尽量不这么做
本指南的另一个观点是 特性的臃肿是一门包含大量高级特性的庞大语言某些情况下我们会限制甚至禁
止使用某些特性这么做是为了保持代码清爽避免这些特性可能导致的各种问题指南中列举了这类特性并解释为什
么这些特性被限制使用
主导的开源项目均符合本指南的规定
注意本指南并非 教程我们假定读者已经对 非常熟悉
1、头文件
通常每一个 .cc文件都有一个对应的 .h文件也有一些常见例外如单元测试代码和只包含 main()函数的 .cc文件
正确使用头文件可令代码在可读性、文件大小和性能上大为改观
下面的规则将引导你规避使用头文件时的各种陷阱
1.1. #dene 保护
所有头文件都应该使用 #define防止头文件被多重包含命名格式当是<PROJECT>_<PATH>_<FILE>_H_
为保证唯一性头文件的命名应该依据所在项目源代码树的全路径例如项目 foo中的头文件 foo/src/bar/baz.h
可按如下方式保护
#ifndef FOO_BAR_BAZ_H_
#define FOO_BAR_BAZ_H_
…
#endif // FOO_BAR_BAZ_H_
1.2. 头文件依赖
能用前置声明的地方尽量不使用 #include
当一个头文件被包含的同时也引入了新的依赖一旦该头文件被修改代码就会被重新编译如果这个头文件又包含了其
他头文件这些头文件的任何改变都将导致所有包含了该头文件的代码被重新编译因此我们倾向于减少包含头文件
尤其是在头文件中包含头文件
使用前置声明可以显著减少需要包含的头文件数量举例说明如果头文件中用到类 File但不需要访问 File类的声
明头文件中只需前置声明 class File;而无须 #include "file/base/file.h"
不允许访问类的定义的前提下我们在一个头文件中能对类 Foo做哪些操作
我们可以将数据成员类型声明为 Foo *或 Foo &
我们可以将函数参数 返回值的类型声明为 Foo但不能定义实现
我们可以将静态数据成员的类型声明为 Foo因为静态数据成员的定义在类定义之外
反之如果你的类是 Foo的子类或者含有类型为 Foo的非静态数据成员则必须包含 Foo所在的头文件
有时使用指针成员 如果是 scoped_ptr更好替代对象成员的确是明智之选然而这会降低代码可读性及执行效率
因此如果仅仅为了少包含头文件,还是不要这么做的好
当然 .cc文件无论如何都需要所使用类的定义部分自然也就会包含若干头文件
1.3. 内联函数
只有当函数只有 行甚至更少时才将其定义为内联函数
定义
当函数被声明为内联函数之后编译器会将其内联展开而不是按通常的函数调用机制进行调用
优点
当函数体比较小的时候内联该函数可以令目标代码更加高效 对于存取函数以及其它函数体比较短性能关键的
函数鼓励使用内联
缺点
滥用内联将导致程序变慢内联可能使目标代码量或增或减这取决于内联函数的大小内联非常短小的存取函数
通常会减少代码大小但内联一个相当大的函数将戏剧性的增加代码大小现代处理器由于更好的利用了指令缓存小巧
的代码往往执行更快。
结论
一个较为合理的经验准则是不要内联超过 行的函数谨慎对待析构函数析构函数往往比其表面看起来要更长
因为有隐含的成员和基类析构函数被调用
另一个实用的经验准则内联那些包含循环或 switch语句的函数常常是得不偿失 除非在大多数情况下这些循
环或 switch语句从不被执行
有些函数即使声明为内联的也不一定会被编译器内联 这点很重要比如虚函数和递归函数就不会被正常内联通
常递归函数不应该声明成内联函数(注递归调用堆栈的展开并不像循环那么简单比如递归层数在编译时可
能是未知的大多数编译器都不支持内联递归函数虚函数内联的主要原因则是想把它的函数体放在类定义内为了图个
方便抑或是当作文档描述其行为比如精短的存取函数
1.4. -inl.h 文件
复杂的内联函数的定义应放在后缀名为 -inl.h的头文件中
内联函数的定义必须放在头文件中编译器才能在调用点内联展开定义然而实现代码理论上应该放在 .cc文件中我
们不希望 .h文件中有太多实现代码除非在可读性和性能上有明显优势
如果内联函数的定义比较短小逻辑比较简单实现代码放在 .h文件里没有任何问题比如存取函数的实现理所当然都
应该放在类定义内出于编写者和调用者的方便较复杂的内联函数也可以放到 .h文件中如果你觉得这样会使头文件
显得笨重也可以把它萃取到单独的 -inl.h中这样把实现和类定义分离开来当需要时包含对应的 -inl.h即可。
-inl.h文件还可用于函数模板的定义从而增强模板定义的可读性
别忘了 -inl.h和其他头文件一样也需要 #define保护
1.5. 函数参数的顺序
定义函数时参数顺序依次为输入参数然后是输出参数
函数参数分为输入参数输出参数和输入输出参数三种输入参数一般传值或传 const引用输出参数或输入
输出参数则是非const指针对参数排序时将只输入的参数放在所有输出参数之前尤其是不要仅仅因为是新加的参
数就把它放在最后即使是新加的只输入参数也要放在输出参数之前。
这条规则并不需要严格遵守输入输出两用参数 通常是类结构体变量把事情变得复杂为保持和相关函数的一致性
你有时不得不有所变通
1.6. #include 的路径及顺序
使用标准的头文件包含顺序可增强可读性避免隐藏依赖库库其他库的 .h本项目内的 .h
项目内头文件应按照项目源代码目录树结构排列避免使用 特殊的快捷目录 .当前目录或 ..上级目录例如
google-awesome-project/src/base/logging.h应该按如下方式包含
#include “base/logging.h”
又如dir/foo.cc的主要作用是实现或测试 dir2/foo2.h的功能foo.cc中包含头文件的次序如下
dir2/foo2.h优先位置详情如下
! 系统文件
" 系统文件
# 其他库的 .h文件
剩余55页未读,继续阅读
资源评论
wenhongmingweida
- 粉丝: 1
- 资源: 7
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功