google C++编程风格指南之头文件的包括顺序
google C++编程风格对头文件的包括顺序作出例如以下指示:
(1)为了加强可读性和避免隐含依赖,应使用以下的顺序:C标准库、C++标准库、其他库的头文件、你自己project的头文件。只是这里最先包括的是首选的头文件,即比如a.cpp文件里应该优先包括a.h。
首选的头文件是为了降低隐藏依赖,同一时候确保头文件和实现文件是匹配的。详细的样例是:假如你有一个cc文件(linux平台的cpp文件后缀为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"
隐含依赖又叫作隐藏依赖,即一个头文件依赖其他头文件。
比如:
//A.h
struct BS bs;
...
//B.h
struct BS{
....
};
//在A.c中,这样会报错
#include A.h
#include B.h
//先包括B.h就能够
#include B.h
#include A.h
这样就叫”隐藏依赖”。假设先包括A.h就能够发现隐藏依赖。所以各种规范都要求自身的头文件放在第一个。就能发现隐藏依赖。解决的方法就是在A.h中包括B.h。而不是在A.c中再包括。
(2)在包括头文件时应该加上头文件所在project的文件夹名,即假如你有这样一个projectbase。里面有一个logging.h,那么外部包括这个头文件应该这样写:#include "base/logging.h",而不是#include "logging.h"。
我们看到《Google C++ 编程风格指南》倡导原则背后隐藏的目的是:
(1) 为了降低隐藏依赖,源文件应该先包括其相应的头文件(本文称之为首选项)。
(2)除了首选项外。遵循从一般到特殊的原则。
只是我认为《Google C++ 编程风格指南》的顺序:C标准库、C++标准库、其他库的头文件、自己project的头文件。在最前面漏了一项:操作系统级别的头文件。比方上面样例sys/types.h不能归入C标准库。而是Linux操作系统提供的SDK。
因此我认为更准确的说法应该是:OS SDK .h , C标准库、C++标准库、其他库的头文件、你自己project的头文件。
(3)之所以要将头文件所在project文件夹列出,作用同命名空间一样。为了解决头文件重名问题。
參考文献
[1]http://www.cnblogs.com/clever101/archive/2011/08/21/2147892.html
[2]http://www.cnblogs.com/frydsh/p/3466660.html
google C++编程风格指南之头文件的包括顺序的更多相关文章
- 读书笔记 |Google C++编程风格指南
Google C++编程风格指南 ## 0. 背景 每一个C++程序员都知道,C++具有很多强大的语言特性,但这种强大不可避免的导致它的复杂,这种复杂会使得代码更易于出现bug.难于阅读和维护. 本指 ...
- Google C++编程风格指南 - 中文版
Google C++编程风格指南 - 中文版 from http://code.google.com/p/google-styleguide/ 版本: 3.133原作者: Benjy Weinberg ...
- Java学习笔记(四)——google java编程风格指南(上)
[前面的话] 年后开始正式上班,计划着想做很多事情,但是总会有这样那样的打扰,不知道是自己要求太高还是自我的奋斗意识不够?接下来好好加油.好好学学技术,好好学习英语,好好学习做点自己喜欢的事情,趁着自 ...
- Java学习笔记(五)——google java编程风格指南(中)
[前面的话] 年后开始正式上班,计划着想做很多事情,但是总会有这样那样的打扰,不知道是自己要求太高还是自我的奋斗意识不够?接下来好好加油.好好学学技术,好好学习英语,好好学习做点自己喜欢的事情,趁着自 ...
- Java学习笔记(六)——google java编程风格指南(下)
[前面的话] 年后开始正式上班,计划着想做很多事情,但是总会有这样那样的打扰,不知道是自己要求太高还是自我的奋斗意识不够?接下来好好加油.好好学学技术,好好学习英语,好好学习做点自己喜欢的事情,趁着自 ...
- Google C++编程风格指南
作者:Hawstein 出处:http://hawstein.com/posts/google-cpp-style-guide.html 前言 越来越发现一致的编程风格的重要性,于是把Google的C ...
- Google Java编程风格指南
出处:http://hawstein.com/posts/google-java-style.html 声明:本文采用以下协议进行授权: 自由转载-非商用-非衍生-保持署名|Creative Comm ...
- Google Java编程风格指南中文版
作者:Hawstein出处:http://hawstein.com/posts/google-java-style.html声明:本文采用以下协议进行授权: 自由转载-非商用-非衍生-保持署名|Cre ...
- Google Java 编程风格指南 —— 见微知著
目录 前言 源文件基础 源文件结构 格式 命名约定 编程实践 Javadoc 后记 前言 这份文档是Google Java编程风格规范的完整定义.当且仅当一个Java源文件符合此文档中的规则, 我们才 ...
随机推荐
- SQL表连接查询(inner join(join)、full join、left join、right join、cross join)
下面列出了您可以使用的 JOIN 类型,以及它们之间的差异. JOIN: 如果表中有至少一个匹配,则返回行(join=inner join) LEFT JOIN: 即使右表中没有匹配,也从左表返回所有 ...
- 谈谈HTTP/2对前端的影响【转载】
原文:http://www.peep-squirrel.com/itcontent-2500617.html 随着 HTTP/2 规范的确认,以及主流浏览器(Chrome.Firefox.IE11)对 ...
- sublime 集成git插件,及git常用命令
以前用了很久的totoiseSVN,显然不够高大上,开发界的版本装x利器还得是git.然而git的命令行对没怎么用过linux的人可能觉得还不如用gitGUI,可是当你知道sublime可以集成git ...
- Sqlserver将数据从一个表插入到另一个表
.如果是整个表复制表达如下: insert into table1 select * from table2 .如果是有选择性的复制数据表达如下: insert into table1(column1 ...
- 项目实战2.2—nginx 反向代理负载均衡、动静分离和缓存的实现
实验一:实现反向代理负载均衡且动静分离 1.环境准备: 机器名称 IP配置 服务角色 备注 nginx VIP:172.17.11.11 反向代理服务器 开启代理功能 设置监控,调度 rs01 RIP ...
- Centos下配置tomcat7的https证书
近期搞定了HTTPS配置,特此记录. 1.把下载的文件拷贝到cert文件夹,然后放在tomcat根目录下(与conf同一级目录).2.配置conf下的server.xml,修改下面3个节点,如下: & ...
- 逆向实战第一讲,寻找OllyDbg调试工具的Bug并修复
逆向实战第一讲,寻找OllyDbg调试工具的Bug并修复 首先我们要知道这个OD的Bug是什么. 我们调试一个UNICODE的窗口,看下其窗口过程. 一丶查看OllyDbg 的Bug 1.1spy++ ...
- vim7.3中文乱码问题
在测试机安装vim7.3之后编辑中文文本出现乱码问题. vim在编译安装的时候: ./configure --enable-gdb --enable-multibyte --enable-cscope ...
- 基础5.jQuery常用事件
jQuery常用事件 1.bind() 方法 :为被选元素添加一个或多个事件处理程序,并规定事件发生时运行的函数. 2.blur() 方法:当元素失去焦点时发生 blur 事件. 3.change() ...
- 前端设计师如何提高UI界面中的阅读性
阅读体验是ui设计中必不可少的一项,良好的设计应该都是可读的设计,如果信息都无法正常而清晰的传达,那么设计就失去了意义.设计的可读性和排版设计息息相关,这也就跟设计师的设计功底息息相关.下面简单介绍文 ...