C++ 中类的声明和类的定义分开几乎成了一个不成文的规定。这样做的好处是使得类的声明和实现分开,清晰明了,同时便于库函数发布。但是在实际编程中由此也常常 引起了一些由于头文件的包含顺序问题而产生的符号未定义的编译错误,不明白其中原理有时会让人很头疼。要消除符号未定义的错误的编译错误,最基本的一个做 法就是在引用一个符号(包括变量,函数,结构,类等)之前确保它已经声明或者已经定义。
    实际中编码设计过程中,最基本的一个原则就是在类的头文件中最好不要包含其他头文件,因为这样会使类之间的文件包含关系变得复杂化。要最大限度的遵守这个原则,实际编码设计过程可以采用以下两种方法:
    方法一是在设计一个类的时候尽量保持类的独立性,即使该类尽可能不要依赖其他类库或者函数库,或者退一步来说,尽量不要在类的声明中依赖其他类。这样,在 该类的声明头文件中就可以没有其他头文件。如果实现中用到了其他的类,那么可以只在该类的实现文件中包含用到的类库或者函数库的头文件就行。
    方法二是当类的声明中必须得用到其他类库或者函数库时,方法一便不再适用,当一个类声明中引用的是其他类或结构的指针引用或者是函数引用时,也可以保持上 述原则,做法是采用前向引用,及在该类的声明前面先声明一下该类所用到的类名或者函数名就行。当类声明中引用的是其他类的实例时,上述原则变不能保持,只 有在该类的声明头文件中引用所引用的类库或者函数库的头文件。
然而,实际中,如果一个类要用到很多其他的类指针或者结构指针或者函数名时,虽然采用上述方法二可以保持上述原则,但是在该类的前面将所有用到的类和方法声明一遍会比较麻烦,这种情况下,为了方便也只好在该类的声明头文件中加入其他类库或者函数库中的头文件了。
下面举几个例子: 例子1:最简单的一种情况:两个类A和B之间完全没有关系 这种情况下两个类的声明和定义文件中根本不需要包含对方的声明头文件。(虽然是废话,但是很多人的代码中却大量存在这种情况下仍然互相包含或者包含头文件的情况,主要原因:懒,不想多思考)
例子2:两个类A和B在实现的时候用到了对方 这种情况只需要在每个类的实现文件文件中包含所用到的类的头文件即可。
例子3:两个类A和B在声明的时候通过指针引用到了对方 这种情况下可以在类的声明(头文件中)前面声明一下所用到的类,然后在各自的头文件中包含所用的类的声明头文件。比如: // A.h class   B;   class   A   {   B   *pb;   }
// B.h  class   A;   class   B   {  
A   *pa;   }
// A.cpp #inclue "B.h" #inclue "A.H" ......
// B.cpp #inclue "A.h" #inclue "B.h" ......
    还有,在大型工程程序设计中,一个类往往需要用到很多已有的类库及函数库,把一个类所用到的所有类库头文件都加入到类的定义头文件中往往也非常麻烦,这时 的做法是把那些经常用到的头文件加入到一个公共的头文件中,这个公共头文件在比如叫push.h。要注意的是一些头文件也有依赖关 系,这些文件的包含顺序也小心,否则就会出错。ps,头文件的包含顺序应该是从最特殊到一般,比如:我们应该以这样的方式来#include头文件: 从最特殊到最一般,也就是, #include "本类头文件" #include "本目录头文件" #include "自己写的工具头文件" #include "第三方头文件" #include "平台相关头文件" #include "C++库头文件" #include "C库头文件"

转载于:https://www.cnblogs.com/zhanglanyun/archive/2012/02/02/2335889.html

c++头文件包含技巧相关推荐

  1. 【C/C++】头文件包含之#include的2种用法区别

    在C/C++工程中,常会碰到头文件包含的使用,#include <>和#include " "两者之间的区别,简而言之如下: 1. #include <> ...

  2. C++编程中的头文件包含问题

    一,最好在一个头文件中将系统中所有的头文件包含进来,然后在每个头文件中将这个文件引用进来.如在vs环境下就是stdfax.h文件. 二,在每个头文件中用 #ifndef XXXX #define XX ...

  3. C语言之预处理探究(三):头文件包含

    相关博文:C语言之预处理探究(四):#.##和预定义宏 相关博文:C语言之预处理探究(二):条件编译(Condition Compile) 相关博文:C语言之预处理探究(一):宏 参考博文:C语言的头 ...

  4. 嵌入式开发(S5PV210)——u-boot的头文件包含问题

    前言 uboot和kernel的头文件包含比一般的程序更复杂,将头文件的路径用链接来表示,这样的用意是为了程序的可移植性.uboot是高度可移植的,不同的配置和编译指令可以编译出不同Soc和开发板的程 ...

  5. ZT 头文件包含其实是一想很烦琐的工作 第一个原则应该是,如果可以不包含头文件...

    当出现访问类的函数或者需要确定类大小的时候,才需要用头文件(使用其类定义)    http://blog.csdn.net/clever101/article/details/4751717 看到这个 ...

  6. c语言头文件包含嵌套问题和包含原则

    a.h #include<stdio.h> #ifndef _A_H #define _A_H 只是解决头文件重复包含的问题的,但是头文件嵌套包含,就不代表不会出问题,就会关系错综复杂,出 ...

  7. C语言中头文件包含的处理原则

    很多事不深入以为自己懂了,但真正用到项目上,才发现了问题.曾以为自己写C语言已经轻车熟路了,特别是对软件文件的工程管理上,因为心里对自己的代码编写风格还是有自信的.(毕竟刚毕业时老大对我最初的训练就是 ...

  8. linux系统编程快速定位头文件的技巧之强大的grep命令

    这个技巧来自于我的实际开发碰到的: inet_addr这个函数用于把ip地址转成网络字节序,他的原型:in_addr_t inet_addr(const char *cp); 返回值为一个in_add ...

  9. 头文件包含【预处理】(58)

    包含的意义 包含的方式 方式<> 方式" " 多文件编程 多文件编程意义 多文件编程的前提 多文件包含实例 定义头文件 谁用谁包含 自包含 避免头文件重复包含 包含的意 ...

最新文章

  1. 将项目通过git上传到bitbucket仓库 (附图)
  2. 最短路径算法——Dijkstra and Floyd算法
  3. Cortex-A 的内核寄存器组
  4. css经典布局——头尾固定高度中间高度自适应布局
  5. shell 提示符个性化设置
  6. Java实现Excel导入数据库,数据库中的数据导入到Excel
  7. android服务的应用,Android学习指南之十四:Service详解及应用实例
  8. php设置文件权限问题,php如何设置文件权限
  9. 安卓应用安全指南 六、困难问题
  10. 洛谷——P2026 求一次函数解析式
  11. 极域教室管理软件全屏广播窗口化,解除网络限制,阻止老师监控进程,阻止黑屏安静,强制杀死极域进程等
  12. 数据结构问题解决2.1——单链表存储结构定义详细解释,struct LNode* next解释,为啥next定义成指针类型
  13. 读芯术python讲的怎么样_Python这么火,为什么说它不是未来的编程语言?
  14. 2012年那些大败局
  15. oracleTNS-12555: TNS:permission denied、TNS-12541: TNS:no listener、Instance orcl, status UNKNOWN
  16. 控制反转 vs 依赖注入
  17. 关于QT源代码文件的归类
  18. Huawei SDN Certification 华为SDN网络认证产品EOX公告
  19. RabbitMQ学习笔记:springboot2 amqp集成生产者消费者
  20. python嗅探工具详解附源码(使用socket,带tkinter界面)

热门文章

  1. ZOJ 1970 All in All
  2. tarjan对有向图的缩点(求强连通分量)
  3. 非标准化的阀门企业也在用钉钉宜搭实现数字化转型
  4. 国内唯一,阿里云挺进 Forrester 数据流分析报告“强劲表现者”象限
  5. 智能数据构建与管理平台Dataphin的前世今生:缘起
  6. 物联网Wi-Fi配网方式,你知道几种?
  7. “数据驱动”时代来临,阿里云数据中台如何赋能金融业?(附重磅报告下载)
  8. 赛题解析 | 初赛赛道一:实现一个分布式统计和过滤的链路追踪
  9. QLattice:你不知道的新的机器学习模型
  10. 从零点五开始用Unity做半个2D战棋小游戏(五)