Google C++ Style Guide并不是一个百科全书,也不是一个C++使用指南,但它描述适用于Google及其开源项目的编码指南,并不追求全面和绝对正确,也有许多人置疑它的一些规则。但作为一个最具影响力的编码规范,它里面有许多内容值得我们研究学习。

以下主要摘自GSG负责人Titus Winters在CppCon 2014上的演讲。

制订Google C++ Style Guide的目的

引导开发去做对的事,同时不易犯错。

哲学总结

1 关注于读者,而非作者

(Optimize for the reader, not the writer)

从维护的代码规模以及团队协作的角度考虑,Google C++ Style Guide的制订更加偏向于读者的体验,而非代码作者的感受。原因是代码被用于阅读和理解的开销要远大于编码。

2 适度的规则

(Rules should pull their weight)

法无具细则无法,所以不会列出所有不能做的事项。对于未提到内容,则遵循一个大原则:低调 (Don’t be clever)(另一种相对的做法就是,不要犯傻(Don’t be stupid)。)。

3 标准很重要,但不能迷信

(Value the standard, but don’t idolize)

标准对于工作非常重要,但不代表它是万能的。可以通过cppreference.comStack Overflow去跟进标准的变化,以及相关的讨论,这样更有助于理解标准、使用标准。

4 保持一致性

(Be consistent)

这是最为关键的一项。保持一致性有助于分解工作,并且更好的协作,包括自动化,减少对一些不必要的争论。在GSG中有助于一致性的规则包括:

  • Include guard的命名
  • 参数顺序 (先输入,再输出)
  • 命名空间
  • 声明顺序 (类里先public, 后private, 先方法,再成员变量)
  • 命名规则
  • 格式化 (这种事还是交给工具吧)

5 通过清晰、明确的方式避免歧义和出错的可能性

(If something unusual is happening, leave explicit evidence for the reader)

核心是以明确的方式编写代码。比如:

  • 常量引用代表输出参数,指针表示会被函数修改
  • overridefinal对成员函数的修饰
  • Interface类、Client类等的名称使用相应的后缀(Interface,Client)。
  • 函数的重载没有使用不同的函数名来得明确
  • 可变参数、以及缺省函数参数都可能导致使用者理解上的问题,而有误用的可能
  • 使用异常处理(Exception),不如错误处理(Error handling)明确

6 避免风险难控的实现,亦或是奇巧淫技,因为太难维护

(Avoid constructs that are dangerous or suprising, Avoid tricky and hard-to-maintain constructs)

这里包括了两条,一是有风险,或者冷不丁会给个惊喜的实现方式:

  • 复杂的static和全局对象,会在退出时出现问题
  • 使用overridefinal可以避免错误使用
  • 使用异常常常会转移错误,是非常危险的

另一条是一些隐晦的技术会带来维护上的压力。比如:

  • 不要使用宏 (复杂,不清晰)
  • 模板类元编程 (复杂)
  • 非公有化的继承 (可能会带来意外惊吓)
  • 多重继承 (很难维护)

7 不要污染全局命名空间

(Avoid polluting the global namespace)

因为代码太大,如果没有控制,全局命名空间里的冲突可能性非常高。所以一个重要的规则就是限制使用全局命空间。也是分而治之的思想。重点是:

  • 将代码放到命名空间里
  • 不要在头文件里将using放到全局命名空间里。它会随着引用依赖而扩散
  • 虽然在.cc文件没那么重要,但仍然建议将static变量放到匿名命名空间里,不要使用using namespace来引用其它命名空间

8 必要时向调优及实用性让步

(Concede to optimization and practicalities when necessary)

有一些规则主要推荐某种更优的实践。比如:

  • 前置声明 (优化编译时间)
  • Inline函数 (限定于较小的函数)
  • 推荐使用前置递增 (++i, 特别是迭代器)

9 关于争议性的规则

Titus通过对两个最具争议的规则说明了如何运用上面的规则达成目前的结论的。两个最具争议的规则是:

  • 不能有非常量引用的输入参数 (No Non-const reference as function arguments)
  • 不使用异常 (No use of exceptions)

我这里只说明第一条所依据的规则:

  • 一致性 (和众多代码实现保持一致)
  • 清晰、明确,便于排查 (有没有不合预期的修改,甚至编译期就可以预防问题)
  • 有风险、可能带来意外惊喜
  • 引用的生命周期问题。原因是开发者对指针的生命周期比较敏感,但对引用的生命周期管理较容易忽视

其中的要点就是在定义规则时要知道为什么要制订它,什么时候应用它, 以及未来又将如何修改它。

转自: Horky,Google C++ Style Guide的哲学

Ps(附上几个Google Style链接):

Google C++ Style Guide的哲学的更多相关文章

  1. [Guide]Google C++ Style Guide

    0.0 扉页 项目主页 Google Style Guide Google 开源项目风格指南 -中文版 0.1 译者前言 Google 经常会发布一些开源项目, 意味着会接受来自其他代码贡献者的代码. ...

  2. Google C++ Style Guide在C++11普及后的变化

    转 http://www.cnblogs.com/chen3feng/p/5972967.html?from=timeline&isappinstalled=0&lwfrom=user ...

  3. 一张图总结Google C++编程规范(Google C++ Style Guide)

    Google C++ Style Guide是一份不错的C++编码指南,我制作了一张比較全面的说明图,能够在短时间内高速掌握规范的重点内容.只是规范毕竟是人定的,记得活学活用.看图前别忘了阅读以下三条 ...

  4. Google Shell Style Guide

    转自:http://google.github.io/styleguide/shell.xml Shell Style Guide Revision 1.26 Paul Armstrong Too m ...

  5. Google JavaScript Style Guide

    转自:http://google.github.io/styleguide/javascriptguide.xml Google JavaScript Style Guide Revision 2.9 ...

  6. electron教程(番外篇一): 开发环境及插件, VSCode调试, ESLint + Google JavaScript Style Guide代码规范

    我的electron教程系列 electron教程(一): electron的安装和项目的创建 electron教程(番外篇一): 开发环境及插件, VSCode调试, ESLint + Google ...

  7. Google coding Style Guide : Google 编码风格/代码风格 手册/指南

    1 1 1 https://github.com/google/styleguide Google 编码风格/代码风格 手册/指南 Style guides for Google-originated ...

  8. [Guide]Google Python Style Guide

    扉页 项目主页 Google Style Guide Google 开源项目风格指南 - 中文版 背景 Python 是Google主要的脚本语言.这本风格指南主要包含的是针对python的编程准则. ...

  9. Google C++ Style Guide

    Background C++ is one of the main development languages used by many of Google's open-source project ...

随机推荐

  1. BZOJ 4044 Virus synthesis (回文自动机+dp)

    题目大意: 你可以在一个串的开头或者末尾加入一个字符,或者把当前整个串$reverse$,然后接在前面或者后面,求达到目标串需要的最少操作次数 对目标串建出$PAM$ 定义$dp[x]$表示当前在回文 ...

  2. [CodeForces] 543B Destroying Roads

    脑洞+暴力. 因为边权是1,所以bfs一下,O(n^2)求任意两点间最短路,再枚举. ans最大是\(dis_{s1,t1}+dis_{s2,t2}\) 再考虑有公共边的情况,一定存在两个点 u, v ...

  3. 设置PATH 环境变量、pyw格式、命令行运行python程序与多重剪贴板

    pyw格式简介: 与py类似,我认为他们俩卫衣的不同就是前者运行时候不显示终端窗口,后者显示 命令行运行python程序: 在我学习python的过程中我通常使用IDLE来运行程序,这一步骤太过繁琐( ...

  4. [luogu] P3089 [USACO13NOV]POGO的牛Pogo-Cow

    P3089 [USACO13NOV]POGO的牛Pogo-Cow 题目描述 In an ill-conceived attempt to enhance the mobility of his pri ...

  5. STM32使用HAL库实现ADC单通道转换

    STM32的ADC转换还是很强大的,它具有多个通道选择,这里我就不细说,不了解的可以自行百度,这里只是选取单通道,实现ADC转换.在文章开始之前,我说一下数据左对齐跟右对齐的差别,以前一直糊里糊涂的, ...

  6. excel2013超链接进不去,提示“您的组织策略不允许...”

    搜索regedit 然后找到HKEY_CURRENT_USER->Software->Classes->.html 右键修改或者双击修改数值数据为Htmlfile 关闭之后此窗口,关 ...

  7. UVALive 3231 Fair Share

    Fair Share Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVALive. Origina ...

  8. 洛谷 1063 dp 区间dp

    洛谷 1063 dp 区间dp 感觉做完这道提高组T1的题之后,受到了深深的碾压,,最近各种不在状态.. 初看这道题,不难发现它具有区间可并性,即(i, j)的最大值可以由(i, k) 与 (k+1, ...

  9. oracle间隔分区

    http://blog.csdn.net/rznice/article/details/55048876

  10. Maven导入ojdbc14.jar和ojdbc6.jar

    Maven导入ojdbc14.jar和ojdbc6.jar 学习了:http://blog.csdn.net/johon_medison/article/details/51689690 在 ‘运行’ ...