C++头文件包含顺序问题

2023-05-16

C++中类的声明和类的定义分开几乎成了一个不成文的规定。这样做的好处是使得类的声明和实现分开,清晰明了,同时便于库函数发布。但是在实际编程中由此也常常引起了一些由于头文件的包含顺序问题而产生的符号未定义的编译错误,不明白其中原理有时会让人很头疼。要消除符号未定义的错误的编译错误,最基本的一个做法就是在引用一个符号(包括变量,函数,结构,类等)之前确保它已经声明或者已经定义。

     实际中编码设计过程中,最基本的一个原则就是在类的头文件中最好不要包含其他头文件,因为这样会使类之间的文件包含关系变得复杂化。要最大限度的遵守这个原则,实际编码设计过程可以采用以下两种方法:
     方法一是在设计一个类的时候尽量保持类的独立性,即使该类尽可能不要依赖其他类库或者函数库,或者退一步来说,尽量不要在类的声明中依赖其他类。这样,在该类的声明头文件中就可以没有其他头文件。如果实现中用到了其他的类,那么可以只在该类的实现文件中包含用到的类库或者函数库的头文件就行。
     方法二是当类的声明中必须得用到其他类库或者函数库时,方法一便不再适用,当一个类声明中引用的是其他类或结构的指针引用或者是函数引用时,也可以保持上述原则,做法是采用前向引用,及在该类的声明前面先声明一下该类所用到的类名或者函数名就行。当类声明中引用的是其他类的实例时,上述原则变不能保持,只有在该类的声明头文件中引用所引用的类库或者函数库的头文件。
然而,实际中,如果一个类要用到很多其他的类指针或者结构指针或者函数名时,虽然采用上述方法二可以保持上述原则,但是在该类的前面将所有用到的类和方法声明一遍会比较麻烦,这种情况下,为了方便也只好在该类的声明头文件中加入其他类库或者函数库中的头文件了。
下面举几个例子:
例子1:最简单的一种情况:两个类A和B之间完全没有关系
这种情况下两个类的声明和定义文件中根本不需要包含对方的声明头文件。(虽然是废话,但是很多人的代码中却大量存在这种情况下仍然互相包含或者包含头文件的情况,主要原因:懒,不想多思考)
例子3:两个类A和B在声明的时候通过指针引用到了对方
这种情况下可以在类的声明(头文件中)前面声明一下所用到的类,然后在各自的头文件中包含所用的类的声明头文件。比如:
// A.h
class    B;   
   class    A   
   {   
           B    *pb;   
   }
// B.h  
   class    A;   
   class    B   
   {   
           A    *pa;   
   }

     还有,在VC++程序设计中,一个类往往需要用到很多已有的类库及函数库,把一个类所用到的所有类库头文件都加入到类的定义头文件中往往也非常麻烦,这时的做法是把那些经常用到的头文件加入到一个公共的头文件中,这个公共头文件在VC++中是stdafx.h。要注意的是VC++中的一些头文件也有依赖关系,这些文件的包含顺序也小心,否则就会出错。
     顺便提一句,VC++中的PCH(Precompiled Header File)主要目的是为了加快编译速度,预编译头文件中包括了stdafx.h文件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++头文件包含顺序问题 的相关文章

  • zookeeper集群安装

    准备3台服务器 xff0c 安装三个zookeeper xff0c 修改zoo cfg配置 xff0c dataDir 61 opt module zookeeper 3 5 7 zkData 分别在zkData目录下创建一个文件myid
  • zookeeper 启动停止脚本

    bin bash case 1 in 34 start 34 for i in 192 168 66 133 192 168 66 134 192 168 66 129 do echo zookeeper i 启动 ssh i 34 opt
  • ElasticSearch-全文检索

    docker 下载安装 es镜像 docker pull elasticsearch 7 4 2 es的可视化工具 docker pull kibana 7 4 2 mkdir p mydata elasticsearch config m
  • atoi()和stoi()的区别----数字字符串的处理

    相同点 xff1a 都是C 43 43 的字符处理函数 xff0c 把数字字符串转换成int输出 头文件都是 include lt cstring gt 不同点 xff1a atoi 的参数是 const char 因此对于一个字符串str
  • ROS基础教程--CostMap_2D包的一些理解

    本文是在综合了多篇文章的基础之上进行的综合 1 基本概念 Voxel xff1a 体素 xff0c 即顾名思义是体积的像素 用来在三维空间中表示一个显示基本点的单位 类似于二维平面下的pixel xff08 像素 xff09 voxel是三
  • [move_base-24] process has died [exit code -6, cmd lib/move_base/move_base odom:=mobile_base_control

    尝试使用TIAGo机器人进行SLAM时 xff0c 运行 roslaunch tiago 2dnav gazebo tiago mapping launch public sim 61 true 指令时加载TIAGo机器人失败 xff0c
  • geoserver集群搭建及数据共享设置

    Geoserver版本及所需依赖 geoserver 2 16 0geoserver 2 16 SNAPSHOT jms cluster plugingeoserver 2 16 SNAPSHOT activeMQ broker plugi
  • postgresql 9.5 now()函数少8小时

    select now 时获取的时间比系统时间少8小时 xff0c 时区问题 xff0c 可能是postgresql conf中的log timezone timezone没有配置成 PRC SELECT now AT TIME ZONE 3
  • sld样式文件demo

    标注样式为 xff1a 代码为 xff1a lt xml version 61 34 1 0 34 encoding 61 34 UTF 8 34 gt lt StyledLayerDescriptor xmlns 61 34 http w
  • 清理Linux buffer/cache内存的方法

    解决Linux buffer cache内存占用过高的办法 xff08 转载 xff09 Linux中Cache内存占用过高解决办法 xff08 转载 xff09
  • windows10下修改Docker镜像目录

    1 背景需求 Windows 版本 xff08 Windows 10 wsl 2 xff09 docker 默认程序安装到c盘 xff0c 数据存储于C Users 当前用户名 AppData Local Docker wsl data e
  • conda 创建的 python 虚拟环境中安装 gdal

    在 conda 创建的Python虚拟环境中安装 gdal 可以按照以下步骤 xff1a 1 打开Anaconda Prompt或者终端 xff0c 激活创建的虚拟环境 xff0c 比如 xff1a conda activate your
  • Ubuntu远程部署及访问jupyter

    一 Ubuntu下安装jupyter notebook 创建虚拟环境 conda create n myjupyter python 61 3 9 激活虚拟环境 conda activate myjupyter 安装jupyter pip
  • postgresql 日志配置

    配置文件日志部分参数说明 REPORTING AND LOGGING Where to Log log destination 61 39 stderr 39 Valid values are combinations o
  • Postgresql 14配置文件解释说明

    Postgresql 14配置文件postgresql conf的解释说明 Postgresql 14配置文件 xff0c 配置项翻译及解释说明 suntoon 64 postgres14 data sudo nano postgresql
  • C++标准库之迭代器

    迭代器是对指针进行进一步抽象的产物 迭代器是遍历所有容器 xff08 序列 xff09 流的统一界面 xff0c 是标准库泛形算法的基础 迭代器根据其能力分为五种 xff1a categorypropertiesvalid expressi
  • 【STM32】UART串口通信详解

    目录 一 数据通信方式 1 串行与并行通信2 全双工 半双工及单工通讯3 同步通讯与异步通讯 二 串口通讯协议 STM32串口简介1 物理层1 RS232标准2 USB转串口 重点 3原生的串口到串口2 协议层1 xff09 通讯的起始和停
  • jetson tx2 刷机,安装 cuda、opencv 详细教程

    jetson tx2 刷机 xff0c 安装 cuda opencv 详细教程 jetson tx2 的详细介绍和用途可见官网 xff1a Nvidia jetson tx2 接下来主要说明jetson tx2 详细刷机过程以及在过程中踩过
  • C#使用Modbus协议读写汇川PLC的M区寄存器(基本接口封装)

    C 使用Modbus TCP协议读取汇川PLC xff0c Modbus读写是按照MW地址来处理的 寄存器单位是字WORD xff0c 占用两个字节 xff0c 类似于C 中的ushort xff08 UInt16 xff09 xff0c
  • 单片机UART串口通讯波形实测

    为了对串口通讯的过程有所了解 xff0c 采用Saleae 的逻辑分析仪对STC15F204EA采用定时中断模拟的串口信号进行了实时抓取 xff0c 以确认这种通讯方法的稳定性 STC15F204EA上没有硬件UART口 xff0c 只能通

随机推荐