头文件互相包含所引发的的问题(深入剖析)

2023-05-16

今天写程序出现了一个让人蛋疼的错误,后来发现是由于头文件互相包含所引起的。

原本只是简单的以为头文件互相包含只会触发,头文件的递归包含。即,A包含B,所以才A的头文件里会将B的头文件内容拷贝过来,然后B里又包含A,又将A

拷贝一份,这样就会无限循环。(下图为A.h和B.h互相包含,进行预编译时的结果·)

在这里插入图片描述

对于上述的问题,windows中有特有的#pragma once。但是更通用的做法是

#ifndef INCLUDE_文件名_H

#define INCLUDE_文件名_H

/中间内容/

#endif//!INCLUDE_文件名_H

以上都可以避免上述问题。

但是,今天的问题(如下图所示),很明显A需要B,但是找不到B的声明和实现。

在这里插入图片描述

这是为什么呢,我们进行预编译,然后在预编译文件中看一下

在这里插入图片描述

我们可以明显的看到,再进行去重复之后,A和B的类声明都只有一份,但是就是因为只有一份,所以必然有一个类会在另一个类之前进行了定义。

这个先后顺序,和你inlude包含的顺序有关系。因为,我们都知道预处理会把你include文件中的内容简单拷贝过来,所以,拷贝顺序和你include的顺序是有关系的。

言归正传,因为A在B之前定义了,所以对于B来说,可以找到A的声明和实现,但是对于A来说,它是找不到B的,但是,它的实现是依赖于B的,这就会导致图中的报错。

在这里,我们也可以推理到,如果A的实现和B无关,那么无论怎么相互包含,只要我们进行过了去重复的处理,都无所谓,不会出现问题。

既然,知道了问题的根源,那么处理问题的方法,也就可以简单的得到,既然A找不到B,我们又需要用B,那就自己手动的把B的声明加到A类的前面,

然后所有问题都解决了。。。。。。

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

头文件互相包含所引发的的问题(深入剖析) 的相关文章

随机推荐

  • 图像处理: OpenCV编程详解(C++) 【持续更新中】

    原创不易 xff0c 侵权必究 作者联系方式 QQ 993678929 一 开发环境配置 Visual Studio 2019 43 opencv 这里仅记录配置过程中可能遇到的问题 由于找不到 opencv world450 dll xf
  • Windows电脑把蓝牙耳机识别成未知设备怎么办?(无法识别蓝牙耳机)

    首先打开蓝牙设置转到 设备与打印机 你会看到被识别为未知设备的耳机出现在这里 右击它 xff0c 点击属性 xff0c 切换到服务选项卡 耳机的话把这个勾选 xff0c 如果是其他蓝牙设备则根据情况勾选 点击确定 然后关掉再打开蓝牙 xff
  • C++ 笔面试知识点大全 附超详细解析 【持续更新中】 (校招/实习/大厂/笔试/面试)

    目录 关键字autodecltypeconststaticexternexplicitvolatileinline Lambda表达式顶层const和底层const类型转换多态 xff0c 虚函数 xff0c 隐藏和重写虚函数的实现机制 x
  • Unity Shader:光照模型,纹理,详细注释

    Phong光照模型 进入摄像机的光线分为四个部分 环境光 xff08 ambient xff09 其他所有间接光照 自发光 xff08 emissive xff09 给定一个方向 xff0c 模型表面本身向该方向发射多少辐射量 漫反射 xf
  • 算法与数据结构 面试知识点大全【持续更新中】(校招/社招/实习/大厂/面试)

    文章目录 排序算法1 冒泡排序2 插入排序3 归并排序4 快速排序5 选择排序 二分搜索1 数组中第k大的数字2 875 爱吃香蕉的珂珂 力扣 xff08 LeetCode xff09 https leetcode cn problems
  • 堆栈

    栈是一种执行 后进先出 算法的数据结构 设想有一个直径不大 一端开口一端封闭的竹筒 有若干个写有编号的小球 xff0c 小球的直径比竹筒的直径略小 现在把不同编号的小球放到竹筒里面 xff0c 可以发现一种规律 xff1a 先放进去的小球只
  • 大端小端和C实现大小端字节序的转化

    大端小端 小端就是低位字节放在内存的低地址端 xff0c 高位字节放在内存的高地址端 大端就是高位字节放在内存的低地址端 xff0c 低位字节放在内存的高地址端 举一个例子 xff0c 比如数字0x12 34 56 78 xff08 注意7
  • 【计算机图形学/实时渲染】 阴影(GAMES202)

    阴影 对于静态的物体 xff0c 可以使用Lightmap烘焙的方法来获取物体的影子 xff08 静态阴影 xff09 xff0c 而对于动态的物体 xff0c 一般采用的是Shadowmap的技术 光照贴图 xff08 Lightmap
  • 解决Mingw-w64下载太慢问题

    官网下载太慢了 xff0c 我们只用换一个镜像源就可以 1 点击Problems Downloading 2 切换香港的
  • 嵌入式Linux开发8——UART串口通讯

    1 背景知识 1 1 UART通讯格式 串口全称叫做串行接口 xff0c 通常也叫做 COM 接口 xff0c 串行接口指的是数据一个一个的顺序传输 xff0c 通信线路简单 使用两条线即可实现双向通信 xff0c 一条用于发送 xff0c
  • 二叉树笔记

    二叉树 二叉搜索 xff08 排序 查找 xff09 树 二叉查找树 xff08 Binary Search Tree xff09 xff0c xff08 又 xff1a 二叉搜索树 xff0c 二叉排序树 xff09 它或者是一棵空树 x
  • C++面试常见题目

    C 43 43 面试常见题目 c 43 43 编译过程自动类型推导auto和decltype重载 重写 xff08 覆盖 xff09 和隐藏的区别C 43 43 构造函数和析构函数能调用虚函数吗volatile关键词运算符重载格式noexe
  • 计算机网络面试常问问题

    C 43 43 面试 计算机网络常见问题 计算机网络常见问题TCP IP协议笔记TCPTCP的特点及目的序列号与确认应答提高可靠性为什么是三次握手和四次挥手滑动窗口流量控制拥塞控制TCP粘包问题 httphttp和https的区别https
  • Trajectory generation for quadrotor while tracking a moving target in cluttered environment

    四旋翼在杂波环境下跟踪运动目标的轨迹生成 摘要1 文章主要贡献2 前言2 1 轨迹公式2 2 实现结构 3 跟踪轨迹生成3 1 标称路径点生成3 2 可行路径点生成3 3 安全飞行走廊生成3 4 代价函数3 5 强制约束3 6 求解跟踪轨迹
  • 翻译-Frustum PointNets for 3D Object Detection from RGB-D Data

    Frustum PointNets for 3D Object Detection from RGB D Data 摘要介绍相关工作从RGB D数据中检测三维物体基于前视图图像的方法 xff1a 基于鸟瞰图的方法 基于3D的方法 点云的深度
  • Online Trajectory Generation of a MAV for Chasing a Moving Target in 3D Dense Environments

    微型无人机的在线轨迹生成 xff0c 用于在3D密集环境中追踪运动目标 摘要一 介绍二 相关工作A 在障碍物环境中追逐B 通过预先规划安全地生成轨迹 三 问题陈述A 问题设置B 能力C 命名 IV 视点生成A 可见度指标B 具有安全性和可见
  • 配置目标跟踪开源项目traj_gen_vis踩过的坑

    项目地址 https github com icsl Jeon traj gen vis 安装依赖需注意的问题 traj gen with qpoases 需安装ros分支的代码 xff08 这个作者并没有指出 xff0c 坑 xff09
  • cmake arm-none-eabi-gcc for stm32 cpp project

    尝试把原有的stm32工程F1canBootloader用cmake来管理 xff0c 遇到了以下几个坑 xff1a 1 报错 xff0c undefined reference to 96 dso handle 39 CMakeFiles
  • 网络攻防之wireshark抓取登录信息

    使用wireshark抓取登录信息 简介 xff1a Wireshark xff08 前称Ethereal xff09 是一个网络封包分析软件 网络封包分析软件的功能是撷取网络封包 xff0c 并尽可能显示出最为详细的网络封包资料 Wire
  • 头文件互相包含所引发的的问题(深入剖析)

    今天写程序出现了一个让人蛋疼的错误 xff0c 后来发现是由于头文件互相包含所引起的 原本只是简单的以为头文件互相包含只会触发 xff0c 头文件的递归包含 即 xff0c A包含B xff0c 所以才A的头文件里会将B的头文件内容拷贝过来