Google 编程规范本地化、简化。如有需要,可参考 Google C++ code style guide原文:
http://google.github.io/styleguide/cppguide.html
本文档基于网上流传的Google C++编程风格指南
,由 edisonpeng(2009/3/25)
整理
本地化简化由MISAS
开发团队使用。在此分享以供各开发团队参考。
目录
作用域
命名空间
在.cc文件中,提倡使用不具名命名空间。如果使用具名命名空间,基于项目或路径名称而不是using指示符。命名空间内不用缩进。
定义:
命名空间将全局作用域细分为不同的具名作用局,可有效防止全局作用局的命名冲突。
优点:
命名空间的命名轴线可嵌套。父级命名不同时即使当前命名重复也不会冲突。
缺点:不具名命名空间容易违背C++中唯一定义的原则。
结论:合理使用
嵌套类
不要将嵌套类定义为public,除非是接口的一部分。
非成员函数、静态成员函数、全局函数
使用命名空间内的非成员函数和静态成员函数,尽量不使用全局函数。
局部变量
将函数变量尽可能至于最小作用域内,在声明变量时将其初始化。
C++允许在函数的任何位置声明变量,提倡在尽可能小的作用域中声明变量,离第一次使用越近越好。这样代码易于阅读且易于定位变量的声明位置、变量类型和初始值。特别是,应使用初始化代替声明+赋值的方式。
全局变量
禁止class类型的全局变量,多线程代码中禁止非常数全局变量,禁止使用函数返回值初始化全局变量。
class类型的全局变量内部构造、析构等初始化操作每次生成有可能变化,从而导致难以发现的bugs。
因此,禁止使用class类型的全局变量(包括STL中的string、vector等等)。
全局的字符串常量,使用C风格的字符串,不要使用STL的string。
注意: 静态成员变量视为全局变量,也不能是class类型。
总结:
(1) .cc中的不具名命名空间可避免命名冲突且限定作用域,避免使用using提示符污染命名空间;
(2) 嵌套类符合局部使用原则,可惜不能再其他头文件前置声明,尽量不要public;
(3) 尽量不用全局函数和全局变量,考虑作用域和命名空间限制,尽量单独形成编译单元;
(4) 多线程中的全局变量不要使用class类型(含STL容器),避免不明确行为导致的bugs
作用域的使用,除了考虑名称污染、可读性外,主要是为了降低耦合度,提高编译、执行效率。