Google C++ 编码规范——1.头文件
2016-11-30 11:46
323 查看
第一篇博客,第一次用markdown,从规范做起,也从规范讲起。(建议初学者从编码规范学起,不懂的再上网搜或查全书如C++ primer)
个人觉得,要想学好C++,首先你要熟悉语法。想要写出漂亮的编码,必须要有一套编码规范。学习Google发布的C++编码规范,有助于规范代码风格和理解语言特性,避免入坑。
项目foo中的头文件foo/src/bar/baz.h按如下方式保护:
#program once也能提供此功能,但是有的编译器不支持,#define方式被广泛支持,所以推荐#define方式。
头文件中所#include的文件一旦被改变,这个头文件的代码将重新编译;而且所#include文件中的代码将别编译进来。
减少头文件依赖(解耦)一方面避免稍作修改就要重新编译大量代码,另一方面可以避免引入额外的代码。
举例说明:头文件中用到类File,但不需要访问File的定义,则头文件中只需前置声明class File;无需#include”file/base/file.h”。
在头文件如何做到使用类Foo而无需访问类的定义?
将数据成员类型声明为Foo*或Foo&;
参数、返回值类型为Foo的函数只是声明(但不定义实现);
静态数据成员的类型可以被声明为Foo,因为静态数据成员的定义在类定义之外。
但如果你的类是Foo的子类,或者含有类型为Foo的非静态数据成员,则必须为之包含头文件.
当然, .cc(或.cpp)文件无论如何都需要所使用类的定义部分,自然也就会包含若干头文件。
废话少说,上代码:
(ps:并没有效率上的原因,多是方便可读性或者团队协作)
C++函数参数分为输入参数和输出参数两种,有时输入参数也会输出(译者注:值被修改时)。输入参数一般传值或常数引用( const references, 即 const &, 一般不用传值,这个以后再说) ,输出参数或输入/输出参数为非常数指针( non-const pointers, 包括引用&) 。对参数排序时,将所有输入参数置于输出参数之前。
项目内头文件应按照项目源代码目录树结构排列,并且避免使用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的包含次序如下:
个人觉得,要想学好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
相关文章推荐
- Google C++ 编码规范(中文版)
- Google C++ 编码规范
- Google编码规范 C++ Style Guide, JavaScript Style Guide, Objective-C Style Guide, and Python Style Guide
- google c++ 编码规范
- 【转】Google C++ 编码规范一览表
- google编码规范-----C++其他特性(3)
- Google C++ 编码规范
- Google C++ 编码规范(中文版)
- c/c++编码规范 - 头文件
- Google C++ 编码规范(中文版)
- C/C++语言编码规范(转载)
- google C++ 编程规范
- Google C++ 编码风格精简
- google的编码规范----背景(一)
- PHP编码规范之注释和文件结构说明
- VS2008中自定义C++工程模板与修改新建文件默认编码的办法
- 编码规范之头文件
- 读google c++ 编程规范 中的一点小总结
- C++ UTF-8编码识别(分析文件内容,非文件头)
- Google放出C++代码风格规范