您的位置:首页 > 编程语言 > C语言/C++

Google C++ 编码规范——1.头文件

2016-11-30 11:46 323 查看
  第一篇博客,第一次用markdown,从规范做起,也从规范讲起。(建议初学者从编码规范学起,不懂的再上网搜或查全书如C++ primer)

  个人觉得,要想学好C++,首先你要熟悉语法。想要写出漂亮的编码,必须要有一套编码规范。学习Google发布的C++编码规范,有助于规范代码风格和理解语言特性,避免入坑。

头文件

  头文件是每个C++入门者一定会要接触的东西。读了这部分编码规法,也许你会发现你虽然在学校里面写了几年的C++竟然还是个beginner。

1. #define

头文件中应使用#define防止头文件被多次包含,命名格式:<PROJECT>_<PATH>_<FILE>_H


  项目foo中的头文件foo/src/bar/baz.h按如下方式保护:

#ifndefFOO_BAR_BAZ_H_
#defineFOO_BAR_BAZ_H_
...
#endif//FOO_BAR_BAZ_H_


  #program once也能提供此功能,但是有的编译器不支持,#define方式被广泛支持,所以推荐#define方式。

2. 头文件依赖

使用前置声明尽量减少.h文件中#include的数量。

  头文件中所#include的文件一旦被改变,这个头文件的代码将重新编译;而且所#include文件中的代码将别编译进来。

  减少头文件依赖(解耦)一方面避免稍作修改就要重新编译大量代码,另一方面可以避免引入额外的代码。

举例说明:头文件中用到类File,但不需要访问File的定义,则头文件中只需前置声明class File;无需#include”file/base/file.h”。

  在头文件如何做到使用类Foo而无需访问类的定义?

将数据成员类型声明为Foo*或Foo&;

参数、返回值类型为Foo的函数只是声明(但不定义实现);

静态数据成员的类型可以被声明为Foo,因为静态数据成员的定义在类定义之外。

但如果你的类是Foo的子类,或者含有类型为Foo的非静态数据成员,则必须为之包含头文件.

  当然, .cc(或.cpp)文件无论如何都需要所使用类的定义部分,自然也就会包含若干头文件。

废话少说,上代码:

//A.h
#ifndef A_H
#define A_H

class B;// 不需要#include "B.h",只需在A.cc(A.cpp)中#include即可
class A
{
public:
A();
~A();
void print(B b);
private:
};

#endif


3. 函数参数顺序

定义函数时,参数顺序为:输入参数在前,输出参数在后。

(ps:并没有效率上的原因,多是方便可读性或者团队协作)

  C++函数参数分为输入参数和输出参数两种,有时输入参数也会输出(译者注:值被修改时)。输入参数一般传值或常数引用( const references, 即 const &, 一般不用传值,这个以后再说) ,输出参数或输入/输出参数为非常数指针( non-const pointers, 包括引用&) 。对参数排序时,将所有输入参数置于输出参数之前。

4. 包含文件的名称和顺序

包含次序标准化可增强可读性、避免隐藏依赖( hidden dependencies),次序如下: C库、 C++库、 其他库的.h、 项目内的.h。

项目内头文件应按照项目源代码目录树结构排列,并且避免使用UNIX文件路径.(当前目录)和..(父目录)。例如, google-awesome-project/src/base/logging.h应像这样被包含:#include “base/logging.h

dir/foo.cc的主要作用是执行或测试dir2/foo2.h的功能, foo.cc中包含头文件的次序如

下:

  dir2/foo2.h(优先位置,详情如下)

  C系统文件

  C++系统文件

  其他库头文件

  本项目内头文件

这种排序方式可有效减少隐藏依赖, 我们希望每一个头文件独立编译。 最简单的实现方式是将其作为第一个.h文件包含在对应的.cc中。

举例来说,google-awesome-project/src/foo/internal/fooserver.cc的包含次序如下:

#include "foo/public/fooserver.h" // 优先位置
#include <sys/types.h>
#include <unistd.h>
#include <hash_map>
#include <vector>
#include "base/basictypes.h"
#include "base/commandlineflags.h"
#include "foo/public/bar.h
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++-头文件-规范