Google C++ Style Guide 笔记1

无意中看到了 Google C++ Style Guide ,开始简简单单的的看了一下,发现很有意思,很久都没看英文文档了,这次碰到了,我就简单的翻译了一下,途中才知道英文没学好就罢了,中文也是一塌糊涂,真是“少壮不努力,老大徒伤悲”呀!

Google C++ Style Guide,姑且我翻译为Google C++ 编程规范。每个单位,每个团队,每个人都有自己的编码习惯,也不能说谁的一定好,谁的一定差,总之,我认为有很好的可读性,和有很好的维护性的代码风格为好。

看别人的东西是很有快感的,英文也是那样,但是从英文翻译成中文就很纠结了,恰好最近项目不是很紧张,抽了点空翻译了一下。废话不多,下面开始。首先是各个章节,包含:

1.Header Files

2.Scopinig

3.Classes

4.Google Specific Magic

5.Other C++ Features

6.Naming

7.Comments

8.Formatting

9.Exceptions to the Rules

 

在这篇里面,首先写下前面2章的笔记。

 

 

 

1.Header Files,头文件

每一个cpp文件有应该含有一个.h的头文件,一般规定main()在cpp文件里面。

(1) The #define Guard: #define的保护文件的唯一性

许多头文件用#define来防止被多重包含,使用格式为“<PROJECT>_<PATH>_<FILE>_H_”。

 

(2) Header File Dependencies ,头文件的附属作用

    能使用前置声明的情况下就不要使用#include。大量在.h文件里面使用#inlcude,如果被包含的文件修改,包含的文件就会从新编译。

 

(3) Inline Functions,内联函数

    只有不足10行的代码才建议使用内联函数,合理的使用能很大程度增加程序运行的效率,反之,能减慢程序的速度。

    析构函数最好不要使用内联,因为析构函数实现的代码比你写的要长很多。

    有循环和switch的不要使用内联,除非循环和switch永远没有执行。

    小心虚函数和递归函数,即使你定义为内联函数,编译器也不会按照内联函数来处理。


(4) The -inl.h Files,内联函数的头文件

    在需要的时候你应该定义一个 -inl.h 文件来管理你的内联函数。

    简单的函数在.h里面实现就可以,但是如果稍微复杂一点的,就放在-inl.h文件,来减少.h的大小。

    千万不要忘记用#define来防止多重包含呀!


(5) Function Parameter Ordering 函数参数的排序

    先输入后输出。

    输入的参数总是const&,而输出的参数为non-const。

    不要轻易的再函数后面增加参数,先搞清楚这个函数是输入还是输出!


(6) Names and Order of Includes,头文件的包含顺序

 

   A. dir2/foo2.h (preferred location — see details below).

   B. C system files.

   C. C++ system files.

   D. Other libraries' .h files.

   E. Your project's .h files.

 

 

 

 

2.Scoping 范围

(1)Namespace命名空间

    Namespace 全局划分不同的区域, 在全局上非常有用的阻止名字的冲突。

    分为 Unnamed Namespaces和 Named Namespaces。

    Unnamed Namespaces:

    在cpp文件里面鼓励使用没有名字的命名空间( Unnamed namespaces ),但是在.h文件里面不要使用。

    文件范围内的静态成员变量或者静态成员函数相当于一个unnamed namespace.的成员。

    Unnamed Namespaces的最后一行记得加上注释。

    Named Namespaces:

     Namespaces应该在include 后面使用。

    不要在namespaces std中声明任何东西。

    你不要使用 using namespace来直接引用定义的对象。

        // Forbidden -- This pollutes the namespace.

        using namespace foo;

 

(2)Nested_Classes 嵌套类

    使用公共嵌套类当是接口的时候。

 

(3) Nonmember, Static Member, and Global Functions,

    在一个 namespace 中的非成员函数或者一个全局的静态函数,一般很少使用全局函数。  

 

(4)Local_Variables   局部变量

    在声明的时候记得初始化哦!

    在最近使用到的地方定义。(好像是神马就近原则)

int i;

i = f();      // Bad -- initialization separate from declaration.

       int j = g();  // Good -- declaration has initialization.

 

 

 

    在循环条件中定义的是一个局部变量。

    如果在循环中定义的对象是一个类对象的,放到类外面定义,因为每次循环都要调用类的构造函数和析构函数。

 

(5)Static and Global Variables 静态变量和全局变量

    禁止把类的对象定义为静态变量或者全局变量,由于顺序不明确的构造函数和析构函数,导致很难找到bugs。

    POD类型(int ,char, float......)适合成为静态或者全局变量。

 

    如果确实需要一个类对象是一个全局的或者静态的,考虑一下指针对象。

 

 

(待续)

因我经验不多,英文也差,语文也差,所以有什么不足之处,请各位看官不吝赐教。谢谢!

展开阅读全文

没有更多推荐了,返回首页