英文原文地址

在开发大型的软件项目时,头文件需要得到恰当的管理,甚至在c中也会面临这种问题,当我们用c++开发时,头文件的管理会变得更复杂,更加耗费我们的时间去管理,下面我将讲一些包含规则来简化这个苦差事。

头文件包含规则

  • 当在在当前正在编写的文件中没有预先相应的声明时我们需要include我们需要的头文件,否则我们需要声明。
  • 头文件应该设计的与include的顺序无关.
    • 例如在写x.cpp时尽量确保x.h是x.cpp需要的第一个header file.
  • header file的包含机制允许包含重复的头文件.

接下来我们用一下例子来说明这些规则:

包含头文件范例:

下面的例子阐明了几种不同类型的依赖关系,假设我们有一个类A声明并定义在 a.ha.cpp中.

a.h


#ifndef _a_h_included_
#define _a__h_included_
#include "ABase.h"
#include "b.h"
//前置声明需要的类
class C;
class D; class A : public ABase
{
B m_b;
C *m_c;
D *m_d;
public:
void SetC(C *c);
C *GetC() const; void ModifyD(D*d);
}
#endif

a.cpp

    #include "a.h"
#include "d.h" void A :: SetC(C*c)
{
m_c = c;
} C *A :: GetC() const
{
return m_c;
} void A :: ModifyD(D *d)
{
d -> SetX(0);
d ->SetY(0);
m_d = d;
}

对头文件包含过程的分析

**class Bbase** ABase是基类,需要被A继承,因此Abase需要完整的声明,编译器需要知道ABase对象的大小才能确定类A对象的大小,所以在a.h中应当显式地包含ABase.h **class B** 类B的对象是类A的数据成员,因此类B也需要完整的声明,因为编译器在确定类A对象大小时需要知道类B对象的大小,因此类B也需要显式地包含 **class C** 类c在类A中是以指针类型出现的,在这里a.h或者a.cpp对类c内容的大小不关心,这时候一个前置的类c声明放在a.h中就可以了,在上面a.h和a.cpp中也并没有显式的包含c.h **class D** 类D和类c一样也是作为指针在a.h中出现,所以也只需要在a.h中做前置的声明,但是在a.cpp中用了类D的对象,所以在a.cpp中需要显示的包含d.h

关键点

  • 当需要类的实例参与程序的设计时我们需要显示的包含相应的头文件,但如果是指针我们可以使用前置声明。
  • 在a.cpp中a.h是第一个被包含的头文件,a.h不希望有其他的头文件包含在它前面,由于a.h在a.cpp中作为了第一个包含的头文件,为了程序的正确编译,我们不允许有其他任何的头文件在a.h以前被包含。
    • 如果在所有的类中都遵循这个规则(换句话说就是x.cpp总是将x.h作为第一个包含的头文件),那么将不会产生各个头文件包含的依赖关系。
  • 在a.h中的预处理过程(a_h_include),允许头文件的重复包含。

循环依赖

下面的class X 和 class Y存在循环依赖, 我们通过前置声明来解决这个问题

    /*=======x.h===========*/
class Y; class X
{
Y *m_y;
.....
};
/*=====y.h============*/
class X;
class Y
{
X *m_x;
.......
};

c++中头文件include规则浅析[译]的更多相关文章

  1. Visual Studio 中使用万能头文件 #include <bits/stdc++.h>

    最近开始使用VS,之前用的DEV C++软件可直接使用 #include <bits/stdc++.h>  ,但VS中并没有,为了使用方便,可直接在VS中添加此头文件,方法如下: 1.在安 ...

  2. C++中头文件与源文件的作用详解

    一.C++ 编译模式 通常,在一个 C++ 程序中,只包含两类文件―― .cpp 文件和 .h 文件.其中,.cpp 文件被称作 C++ 源文件,里面放的都是 C++ 的源代码:而 .h 文件则被称作 ...

  3. C语言中头文件怎么写?(本文来源网络,由黑乌鸦进一步完善)

      c语言头文件怎么写?我一直有这样的疑问,但是也一直没去问问到底咋回事:所以今天一定要把它弄明白! 其实学会写头文件之后可以为我们省去不少事情,可以避免书写大量的重复代码.有利于整理思路.使代码脉络 ...

  4. C/C++ 中头文件相互包含引发的问题

    转自:http://blog.csdn.net/hazir/article/details/38600419 今天下午遇到一个头文件相互包含而导致的编译问题,花了我不少时间去调试没找到问题,最后晚上跟 ...

  5. C++ 中头文件(.h)和源文件(.cc)的写法简述

    用C++编写比较大型的项目时,文件的分割管理确实确实是非常必要的 .下面就非常简洁明了地谈谈头文件(.h)和源文件(.cc)应该怎么写. 头文件(.h):写类的声明(包括类里面的成员和方法的声明).函 ...

  6. 万能头文件#include<bits/stdc++.h>

    最近在打cf时赛后翻阅别人的代码总是会发现一个陌生而奇怪的头文件#include<bits/stdc++.h> 奇怪之处就在于基本上所有的代码只要用了这个头文件就不再写其他头文件了. 百度 ...

  7. c中头文件在cpp文件里引用和.h文件引用的思考

    我们在编敲代码中头文件是常常使用的. 可是头文件是应该包括在.H文件里还是在.cpp文件里.在这个其中有什么样去差别呢. 假如说我们编写了一个a.cpp  .我们将a.cpp文件的变量和函数申明在a. ...

  8. C语言中头文件<stdio.h>中的#ifndef _STDIO_H_

    先了解这里的相关知识:http://www.cnblogs.com/stemon/p/4000468.html 头文件的中的#ifndef,这是一个很关键的东西.比如你有两个C文件,这两个C文件都in ...

  9. C语言中头文件和cpp文件解析

    务必提前预读这里的内容:http://www.cnblogs.com/stemon/p/3999844.html 回到cpp文件与头文件各写什么内容的话题上: 理论上来说cpp文件与头文件里的内容,只 ...

随机推荐

  1. 2016.04.09 使用Powerdesigner进行创建数据库的概念模型并转为物理模型

    2016-04-09  21:10:24     本文原创受版权保护,严禁转载. 请大家不要用于商业用途,支持正版,大家都是做软件的,知道开发一套软件实属不易啊! 今天看到了一个很有趣并且很有用的辅助 ...

  2. Java移位运算

    java中移位运算符有三种“<<”.“>>”.“>>>”,没有“<<<”运算符. “<<”运算符将二进制位进行左移,低位用0来填 ...

  3. sqlserver分区表实践:对时间分区表自动进行管理

    项目问题:有一张日志表,插入和查询为主,每天记录数据为200多万,大小为2G-4G之间.一开始开发人员使用delete语句手动删除,保留7天数据,经常造成阻塞和性能瓶颈.但是如果不删除数据随着表越来越 ...

  4. VS软件对应编号

    VC6VC7(2003)VC8(2005)VC9(2008)VC10(2010)VC11(2012)VC12(2013)

  5. CentOS学习笔记--vi程序编辑器

    vi程序编辑器 Linux里经常需要修改一些配置文件,这时就需要一个编辑器,几乎所有的Linux版本都提供了vi这个编辑器. 文件内容查阅cat命令 如果我们要查阅一个文件的内容时,该如何是好呢?这里 ...

  6. zookeeper学习记录

    ZooKeeper:是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.他主要用来解决分布式应用中的数据管理的一致性问题 ...

  7. .Net 内存泄露

    一.事件引起的内存泄露 1.不手动注销事件也不发生内存泄露的情况 我们经常会写EventHandler += AFunction; 如果没有手动注销这个Event handler类似:EventHan ...

  8. win7防火墙打不开(无法启动windows firewall服务)

    点击windows 7控制面板中防火墙的“推荐配置”没有反应:打开“服务”,无法启动windows firewall,并报错.  可能很多的win7用户都碰到过这样的一种情况,那就是win7的防火墙打 ...

  9. 有趣的EditView为空时的抖动效果(用户名和密码)--第三方开源--ClearEditText

    ClearEditText在github上的链接地址是:https://github.com/zhangphil/ClearEditText 用法十分简单,在布局中使用ClearEditText,在J ...

  10. html中的框架

    1.总的代码 <frameset rows=20%,*> <frame src="top.html" /> <frameset cols=30%,*& ...