没有合适的资源?快使用搜索试试~ 我知道了~
谷歌C++编程规范.docx
需积分: 50 30 下载量 97 浏览量
2021-03-01
15:50:17
上传
评论
收藏 94KB DOCX 举报
温馨提示
试读
58页
整理的谷歌代码规范word文档
资源详情
资源评论
资源推荐
谷歌 C++ 编程规范
规则的作用就是避免混乱。但规则本身也一定要权威,有说服力,并且是
理性的。本规范目的是通过详细阐述 C++ 注意事项来驾驭其复杂性,在保证代
码易于管理的同时, 也能高效使用 C++ 的语言特性。本文参照 规范,
汲取其中精华部分,建立适合自身实际情况的编程规范。参考 编程规
范的主因是其严谨性,严谨意味着规范的价值不仅仅局限于它罗列出的规范内
容,更具参考意义的是它为了列出规范而做的谨慎权衡过程。
规范不仅列出你要怎么做,还告诉你为什么要这么做,哪些情况下可以不
这么做,以及如何权衡其利弊。
谷歌 指南地址如下,本文绝大部分内容来自以下内容,小伙伴们可以
直接学习以下内容。
C++实现 源代码的扩展名
、、、
、、、、
!" #、、
$ 头文件
$$ %!头文件
头文件应该能够自给自足(!,也就是可以作为第一个头文
件被引入),以 结尾。
不过有一个例外,即一个文件并不是 self-contained 的,而是作为文本插
入到代码某处。或者,文件内容实际上是其它头文件的特定平台( platform-
&)扩展部分。这些文件就要用 #文件扩展名。
如果 #文件声明了一个模板或内联函数,同时也在该文件加以定义。凡是
有用到这些的 #文件,就得统统包含该头文件,否则程序可能会在构建中链
接失败。不要把这些定义放到分离的 #文件里(译者注:过去该规范曾提
倡把定义放到 里过)。
有个例外:如果某函数模板为所有相关模板参数显式实例化,或本身就是
某类的一个私有成员,那么它就只能定义在实例化该模板的 #文件里。
$' (&保护
所有头文件都应该使用 (&来防止头文件被多重包含,命名格式当是:
)*+,-./01)*2/301)45.0131。
为保证唯一性,头文件的命名应该基于所在项目源代码树的全路径。例如 ,
项目 !中的头文件 !66可按如下方式保护:
(!!4,,12+127131
(&4,,12+127131
(!4,,12+127131
$8 前置声明
尽可能地避免使用前置声明。使用 (包含需要的头文件即可。
定义:
所谓前置声明(!9)是类、函数和模板的纯粹声明,
没伴随着其定义。
优点:
前置声明能够节省编译时间,多余的 (会迫使编译器展开更多的
文件 ,处理更多 的输入 。前 置声明 能够 节 省不 必要的 重新 编译的 时间。
(使代码因为头文件中无关的改动而被重新编译多次。
缺点:
前置声明隐藏了依赖关系,头文件改动时,用户的代码会跳过必要的重新
编译过程。前置声明可能会被库的后续更改所破坏。前置声明函数或模板有时
会妨碍头文件开发者变动其 2*。 例如扩大形参类型,加个自带默认参数的模
板形参等等。
前置声明来自命名空间 的 :6时,其行为未定义。
很难判断什么时候该用前置声明,什么时候该用 (。极端情况下,
用前置声明代替 甚至都会暗暗地改变代码的含义:
6
;<=
>;<=
1
(?6?
@!ABC=
@!A@BC=
@A>BC;!AC=<!ABC
如果 (被 和 >的前置声明替代, AC就会调用 !A@BC。
前置声明了不少来自头文件的 :6时,就会比单单一行的 冗
长。仅仅为了能前置声明而重构代码(比如用指针成员代替对象成员)会使代
码变得更慢更复杂。
结论:
尽量避免前置声明那些定义在其他项目中的实体。
函数:总是使用 (。
类模板:优先使用 (。
$D 内联函数
只有当函数只有 $E行甚至更少时才将其定义为内联函数。
$F (的路径及顺序
使用标准的头文件包含顺序可增强可读性,避免隐藏依赖:
相关头文件,
库,
库,
其他库的 ,
本项目内的 。
项目内头文件应按照项目源代码目录树结构排列,避免使用 特殊的
快 捷 目 录 。 A 当 前 目 录 C 或 A 上 级 目 录 C 。 例 如 ,
9:G6应该按如下方式包含:
(?6?
又 如 , ! 或 !1 的 主 要 作 用 是 实 现 或 测 试
'!'的功能,!中包含头文件的次序如下:
'!'A优先位置,详情如下C
系统文件
系统文件
其他库的 文件
本项目内 文件
这 种 优 先 的 顺 序 排 序 保 证 当 '!' 遗 漏 某 些 必 要 的 库 时 ,
!或 !1的构建会立刻中止。因此这一条规则保证维护
这些文件的人们首先看到构建中止的消息而不是维护其他包的人们。
! 和 '!' 通 常 位 于 同 一 目 录 下 A 如
661和 66C, 但也可以放在不同
目录下。
按字母顺序分别对每种类型的头文件进行二次排序是不错的主意。注意较
老的代码可不符合这条规则,要在方便的时候改正它们。
您 所 依 赖 的 符 号 A:6C 被 哪 些 头 文 件 所 定 义 , 您 就 应 该 包 含
()哪些头文件,前置声明 A!9C情况除外。比如
您要用到 6中的某个符号,哪怕您所包含的 !已经包含了 6,也
照样得包含 6,除非 !有明确说明它会自动向您提供 6中的
:6。不过,凡是 文件所对应的「相关头文件」已经包含的,就不用再
重复包含进其 文件里面了,就像 !只包含 !就够了,不用再管后
者所包含的其它内容。
举例来说, 9:G!!@
的包含次序如下
(?!6!@?优先位置
()0
()0
()1:0
()@0
(?66?
(?6::H?
(?!66?
有时,平台特定(:&)代码需要条件编译(
),这些代码可以放到其它 之后。
' 作用域
'$ 命名空间
鼓励在 文件内使用匿名命名空间或 声明。使用具名的命名空间
时 , 其名 称 可 基于 项 目 名或 相 对 路 径。 禁 止 使用 指 示 (
@)。禁止使用内联命名空间(:)。
定义
命名空间将全局作用域细分为独立的, 具名的作用域, 可有效防止全局作
用域的命名冲突。
优点
虽然类已经提供了(可嵌套的)命名轴线 A注将命名分割在不同类的作用
域内C, 命名空间在这基础上又封装了一层。
举例来说,两个不同项目的全局作用域都有一个类 4,这样在编译或运
行时造成冲突。如果每个项目将代码置于不同命名空间中,G$4和
G'4作为不同符号自然不会冲突。
内联命名空间会自动把内部的标识符放到外层作用域,比如:
:;
:I;
@!AC=
<:I
<:
I!AC与 !AC彼此可代替。内联命名空间主要用来保持跨版本的
2兼容性。
缺点
命名空间具有迷惑性,因为它们使得区分两个相同命名所指代的定义更加
困难。内联命名空间很容易令人迷惑,毕竟其内部的成员不再受其声明所在命
名空间的限制。内联命名空间只在大型版本控制里有用。有时候不得不多次引
用某个定义在许多嵌套命名空间里的实体,使用完整的命名空间会导致代码的
冗长。
在 头 文 件 中 使 用 匿 名 空 间 导 致 违 背 的 唯 一 定 义 原 则 A,
>&+A,>+CC。
结论
根据下文将要提到的策略合理使用命名空间。
遵守命名空间命名中的规则。
像之前的几个例子中一样,在命名空间的最后注释出命名空间的名字。
用命名空间把文件包含,H的声明定义,以及类的前置声明以外的
整个源文件封装起来,以区别于其它命名空间
文件
:::;
剩余57页未读,继续阅读
水笙赵
- 粉丝: 7
- 资源: 33
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0