吐槽 C++ style guide

每个公司大概都有一个自己的 style guide,google 也不例外。特别考虑到 google 代码组织的方式,有一个一致的代码风格是非常有帮助的。也许是对这个东西期望太高了,读完之后非常的失望… 这里是这个 guide 的外部版本,内部版本绝大部分接近,但是有一些诡异的“替代品”。这大概就是跟微软类似的“大公司”的风格了吧,一些 legacy 的存在导致新鲜的血液进不来,从这个角度来说,style guide 反而是很负面的东西。这里我们就一些 style guide 的点进行吐槽。

header files

  • 文件命名习惯,使用 .cc 和 .h,个人更喜欢 .cpp/.hpp,跟 C 的区别更方便
  • forward declaration,这点基本赞同,能去掉 dependency 的话有一定用处,不过注意 delete 的问题(见
  • inline 函数,少于十行
  • -inl.h 用于复杂的 inline 函数
  • 函数参数顺序:输入在前,多为 const reference,输出在后,多使用 pointer,这点上跟很多 functional programming 直接使用返回值不大一样,这种要求调用的函数负责初始化返回对象,被调用的函数并不负责初始化
  • include 的顺序和名称,这点上差不多

scoping

  • namespace:cc 文件并不鼓励使用 namespace,并要使用 using 直接把整个 namespace 里面的东西都弄进来
  • nested class:一般 nested class 跟 enclosing class 关系紧密,某些情况可以考虑仅仅通过 namespace 进行 scoping
  • 非成员、静态和全局函数:尽量使用 namespace 包围函数,或者放在某些类利用作为静态函数
  • local variable,尽量使用,减少 variable 进入其他 scope 的可能(如果没有必要)
  • static 和 global variable,尽量少使用,似乎内部很多东西还是依赖这个的,即使现在都有一些不需要这些东西的 lib 了

classes

  • 避免在构造函数里面进行复杂的操作,将其放在类似 init 等成员函数里面(有一定的道理,但是容易导致一些 bug)
  • 初始化,或者使用 in-class initializer(好像是 C++11 引入的)否则就得在 constructor 里面做
  • 只有一个参数的构造函数使用 explicit 避免 implicit conversion,觉得这个有一定的必要但是不应该强制避免 implicit conversion
  • 尽在必要时提供 copy constructor/assignment operator,这样避免更新时漏掉一些东西
  • 构造函数的 delegation 和 inheritance,感觉这个 guide 不喜欢默认参数,宁肯用 delegation,不过这两者只能选择一个(否则会有歧义)
  • struct vs class,如果仅是数据可以用 struct,其实个人还是很喜欢直接 struct 的,有些封装完全没有意义啊…
  • inheritance:尽量使用 composition,如果继承尽量 public
  • multiple inheritance:尽量使用类似 Java 的单根系统
  • interface,感觉太学 java 了
  • operator overloading,尽量避免(其实很多情况下就是需要这个让代码更好读啊!)
  • access control,成员都是 private,子类要用写 protected accessor,
  • 声明顺序,public、protected 之后 private,比较诡异要求前面有一个 space 的 indentation,习惯上俺不要 indent…
  • short function,这点同意

google specific

  • 使用智能指针表示 ownership,比如 shared_ptr 和 unique_ptr
  • 使用 cpplint.py 做 style check

其他 C++ 特性

  • reference 的参数都必须加 const,这是强制返回部分必须用指针
  • 避免使用 rvalue reference、std::move_iterator 和 std::forward,这块没理解太清楚
  • function overloading 仅在不需要 user figure 语义差异情况下使用
  • default argument 基本不能用…
  • variable length array 和 alloca 也不能用,不过的确不那么常用
  • friend 是允许的
  • exception 是不允许的,这点看起来太傻了,g 家只用 error code 的说
  • 禁用 RTTI,dynamic_cast 一般也很少用,但是有些时候如 boost.any 之类的还是需要这个的啊
  • casting,禁用 C 类型的 casting,这个倒是好
  • stream 仅仅在 logging 里用,这点有点费解,不觉得 stream 本身有啥不好的啊,完全可以共存的东西啊
  • pre-inc 和 post-inc,这个很明确很多时候应该用 pre-inc
  • const 应该尽可能的用避免出现不经意的修改
  • constexpr 也是 C++11 的,合适的地方尽量用
  • integer type 这块最麻烦,基本每个公司都会自己定义一套
  • 64bit portability 要写好其实挺难
  • preprocessor 定义的 macro 尽量少用,但是一般都会有一些固定的 pattern,这个回避不了
  • 0、NULL 和 nullptr,指针最好用 C++11 的 nullptr 了
  • sizeof 偏向用在变量上,也可以用在类型上
  • auto 可以用,但最好只在局部变量,减少不必要的类型声明
  • brace initialization,可以用,显得更一致
  • 不建议使用 lambda expression,这点坚决反对,function、bind 这些都是精华啊!
  • boost 基本被废掉了,坚决反对,我同意一些高级 feature 需要慎用,但是不许用是把大家当傻逼吗?
  • C++11 里面的 ratio 也不让用… 无语了

naming

  • 名字要 descriptive,其实觉得很多时候短的变量名在局部绝对够用了,何必起一个那么长的…
  • 文件名全部小写,使用 snake case 或者把 _ 换 –
  • 类型名使用 CamelCase,其实觉得这个完全可以 snake case 的
  • variable name 使用 snake_case
  • 常量使用 kCamelCase,似乎连 enum 都推荐这样写了
  • 函数名使用 CamelCase,getter/mutator 使用 snake_case,这点太不解了… 这么不 consistent…
  • namespace 使用小写
  • macro 使用 SNAKE_CASE
  • 接近 C++ STL 的东西可以有 exception… 汗…

注释

这部分基本赞同吧

formatting

  • 吐槽的就是 3p 前面的 space
  • 另外 if/for/while/switch 后面有 space 而一般函数名后面谬,其实某种程度上俺觉得也应该有 space
  • #preprocessor 的应该顶格,这个赞同
  • namespace 不需要 indent,这个估计跟 80char wide 有关系

尽管 style guide 的宗旨是 consistency,但是实际情况总是各种 exception 的,特别是 STL 都已经 snake_case 了类名啥的也都 snake_case 了,为啥就不学着点呢?函数名非要加一个 CamelCase 看起来真心四不像啊… 对 boost 的抛弃是我对 google 最大的不满了…

——————
Deliver me, I pray thee, from the hand of my brother, from the hand of Esau: for I fear him, lest he will come and smite me, and the mother with the children.

Advertisements
吐槽 C++ style guide

一个有关“吐槽 C++ style guide”的想法

  1. guojc 说:

    exception 是不允许的,这点看起来太傻了,g 家只用 error code 的说
    主要是与connection lock之类的东西 do not mix well. 少用是建议的,完全禁用有点过了。

  2. zt 说:

    @楼上两位,码农没处去啊!

    @guojc C++ 有 RAII 啊,为啥有 resource 就不好用… 现在都是搞个 error code 传下去,看得人都头大…

  3. zt 说:

    复述的时候不是有吐槽的咩?

    BTW 才发现 24 号一封邮件说 bind/function 解禁了,原来不让用主要原因是内部有个类似的东西,其实没发现那个实现多好,哎,有点文革之后平反的味道…

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s