google编程风格学习小结

来源:互联网 发布:网络医疗美容咨询难吗 编辑:程序博客网 时间:2024/05/01 12:58
第一章 头文件
1. 所有头文件使用#define防止头文件被多重包含,格式:文件名_H_;
2. 头文件中尽量使用前置声明,避免包含过多头文件,但对应的源文件
   必须使用类的定义,所以必须包含相应头文件。
   前置声明:
    * 我们可以将数据成员类型声明为 Foo * 或 Foo &.
    * 我们可以将函数参数 / 返回值的类型声明为 Foo (但不能定义实现).
    * 我们可以将静态数据成员的类型声明为 Foo, 因为静态数据成员的定义在类定义之外.
    * 如果你的类是 Foo 的子类, 或者含有类型为 Foo 的非静态数据成员,
      则必须包含 Foo 所在的头文件
    * .cc 文件无论如何都需要所使用类的定义部分, 自然也就会包含若干头文件
3. 只有当函数只有 10 行甚至更少时才将其定义为内联函数
4. 复杂的内联函数的定义, 应放在后缀名为 -inl.h 的头文件中
5. 定义函数时, 参数顺序依次为: 输入参数, 然后是输出参数.
6. 头文件包含顺序
如, dir/foo.cc 的主要作用是实现或测试 dir2/foo2.h 的功能, foo.cc 中包含头文件的次序如下:

       1. dir2/foo2.h (优先位置,本源文件对应的头文件)
       2. C 系统文件
       3. C++ 系统文件
       4. 其他库的 .h 文件
       5. 本项目内 .h 文件

总结:
译者 (YuleFox) 笔记

   1. 避免多重包含是学编程时最基本的要求;
   2. 前置声明是为了降低编译依赖,防止修改一个头文件引发多米诺效应;
   3. 内联函数的合理使用可提高代码执行效率;
   4. -inl.h 可提高代码可读性 (一般用不到吧:D);
   5. 标准化函数参数顺序可以提高可读性和易维护性 (对函数参数的堆栈空间有轻微影响, 我以前大多是相同类型放在一起);
   6. 包含文件的名称使用 . 和 .. 虽然方便却易混乱, 使用比较完整的项目路径看上去很清晰, 很条理, 包含文件的次序除了美观之外, 最重要的是可以减少隐藏依赖, 使每个头文件在 “最需要编译” (对应源文件处 :D) 的地方编译, 有人提出库文件放在最后, 这样出错先是项目内的文件, 头文件都放在对应源文件的最前面, 这一点足以保证内部错误的及时发现了.
================================================================================
第二章 作用域
1. 名字空间使用
#最好不要使用 ``using`` 关键字, 以保证名字空间下的所有名称都可以正常使用.
    // 禁止 —— 污染名字空间
    using namespace foo;
#在 .cc 文件, .h 文件的函数, 方法或类中, 可以使用 ``using`` 关键字.
    // 允许: .cc 文件中
    // .h 文件的话, 必须在函数, 方法或类的内部使用
    using ::foo::bar;
#在 .cc 文件, .h 文件的函数, 方法或类中, 允许使用名字空间别名.
    // 允许: .cc 文件中
    // .h 文件的话, 必须在函数, 方法或类的内部使用
    namespace fbz = ::foo::bar::baz;
2. 将函数变量尽可能置于最小作用域内, 并在变量声明时进行初始化
3. 如果变量是一个对象, 每次进入作用域都要调用其构造函数, 每次退出作用域都要调用其析构函数

译者 (YuleFox) 笔记

   1. cc 中的匿名名字空间可避免命名冲突, 限定作用域, 避免直接使用 using 关键字污染命名空间;
   2. 嵌套类符合局部使用原则, 只是不能在其他头文件中前置声明, 尽量不要 public;
   3. 尽量不用全局函数和全局变量, 考虑作用域和命名空间限制, 尽量单独形成编译单元;
   4. 多线程中的全局变量 (含静态成员变量) 不要使用 class 类型 (含 STL 容器), 避免不明确行为导致的 bug.
   5. 作用域的使用, 除了考虑名称污染, 可读性之外, 主要是为降低耦合, 提高编译/执行效率.
==================================================================================
第三章 命名约定
1. 文件命名:文件名全部小写,单词间用下划线_;
2. 类命名:每个单词以大写字母开头,不使用下划线;(备注:包括枚举/结构体)
3. 变量命名:一律小写,单词间以下划线相连
   普通变量:如上;
   成员变量:如上,变量结尾加下划线;
   全局变量:如上,以g_开头;
4. 常量命名:单词首字母大写,以字符k开头,如: kDaysInAWeek;
5. 函数命名:普通函数,每单词首字母大写;
            get-set函数,与存取的变量名相同,单词间使用下划线;
6. 命名空间命名:全小写,单词间加下划线;
7. 枚举成员与宏命名:每字符大写,全大写;
==============================================================================