谷歌C++代码规范--翻译学习1

来源:互联网 发布:win10系统开机优化 编辑:程序博客网 时间:2024/05/21 22:23

谷歌CPP 编程规范-- 每天看点,多了也记不住,在实践中改变自己的代码风格吧!


Cpp文件的命名是.cc而不是.cpp,这点不是很明白,为什么不用cpp,而是用cc

http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Scoping

1.   头文件

#define 保护

每个头文件都应该有#define来防止多次被包含,定义应该是在工程目录中的完整路径,例如文件 foo/src/bar/baz.h 在工程foo中应该用如下的方式来保护

#ifndef FOO_BAR_BAZ_H_

#define FOO_BAR_BAZ_H_

#endif //FOO_BAR_BAZ_H

 

头文件依赖

在前向声明可以实现要求的时候,不要使用#include

当一个头文件被引用的时候,一个依赖关系就被建立了,当被包含的头文件被改变的时候,其他的文件就要被重新编译。所以要尽量避免#include的使用

用户可以使用前向声明来减少#include的使用,例如当你的头文件使用File类,但是不需要访问它的声明的时候,你就可以使用前向声明而不是 #include “file/base/file.h”

那么什么时候在头文件中使用一个类Foo,却不需要访问它的定义呢

1.      声明数据成员 Foo * 或者 Foo &

2.      我们可以用类型Foo声明函数参数或者返回值

3.      可以声明一个静态的成员Foo,因为静态成员的定义是在类的外部

但是如果类中有Foo类型的数据成员的时候,就要#include了

有时候使用指针成员而不是对象成员是有意义的,然后这使得程序可读性和性能降低,所以如果仅仅为了使得少使用#include而强迫使用指针成员是不值得的

Note: 如果符号Foo的使用是在源文件中,这个时候应该导入Foo的定义,或者通过#include或者前向声明。

 

内联函数

在代码很小,少于10行的时候,可以使用内联函数

定义

你可以声明一个函数为内联,使得编译器在调用函数的位置展开他们,而不是采用一般的函数调用机制

支持的做法

内联可以提高目标代码效率,所以小函数尽量使用内联,例如set get方法或者其他的对效率要求比较高的代码

不支持的做法

如果代码大于10行,就不要使用内联了。注意析构函数,因为隐式成员函数和基类析构的调用使得他们的代码通常要大于10行。

循环和switch存在的函数不要使用内联

有些时候尽管有内联声明,但是函数却未必内联。例如虚函数,递归。通常虚函数的作用是在类中占一个定义,而不是出于方便或者实现它的行为。

 

-inl.h文件

当需要的时候,可以使用inl.h文件来定义复杂的内联函数

短的内联函数,可以在.h中直接定义,例如get set方法。如果代码比较长的的时候,又不想把内联函数的定义放在.cc文件中,可以使用-inl.h文件来定义内联函数,这使得内联实现和类实现分来,同时允许实现在需要的地方包含进来。

-inl.h另一个用途是定义模板,它使得模板定义容易读懂,和普通的.h一样,使用#define guard

 

函数参数的排序

参数排序的方式为:输入,输出

c/c++参数要么是输入,要么是输出,或者既是输入又是输出(例如指针,引用)。输入参数经常是值或者常引用,输出是非常量的指针。声明参数的时候,输入参数在前,不要图方便在后面加参数,确保输入参数在前面。

 

Includes 的名字和排序

使用标准的排序保证可读性,同时避免隐藏的依赖:C库,C++库,其他库,自定义的.h

对于.cc文件而言,例如foo2.cc

1.      Dir2/foo2.h

2.      C 系统库

3.      Cpp库

4.      其他库

5.      工程其他.h

例如


 

#include “foo/public/foosever.h” //对应的.h

#include <sys/types.h> //C库

#include <unistd.h>

#include<hash_map> //C++库

#include<vector>

 

#include “base/basictypes.h” //其他的工程.h

#include “base/commandlineflags.h”

#include “foo/public/bar.h”

原创粉丝点击