头文件互相包含问题

C++中的头文件重定义问题和互相包含问题 然而,有时候我们可能会遇到头文件的重定义问题和头文件互相包含的问题。C++中的头文件重定义问题和头文件互相包含问题是在编程过程中常见的问题。头文件重定义问题指的是同一个源文件中多次包含同一个头文件导致的命名冲突。当一个头文件被多次包含时,其中的声明和定义也会被多次引入到源文件中,从而导致重定义错误。头文件互相包含问题指的是多个头文件之间相互包含,形成了一个循环依赖的关系。中的#ifndef、#define和#endif指令确保了头文件只被包含一次,避免了重定义错误。这样可以避免出现循环包含的问题。 阅读详情

当我们有两个类的头文件互相包含时,如果出现一个类中有另一个类的对象时,VS就会报这样的错error C4430: 缺少类型说明符 - 假定为 int。

test2.h
#ifndef __test2_H__
#define __test2_H__
#include<iostream>
#include "test1.h"
using namespace std;
class test2
{
public:
    int sub(int a,int b);
    test1 a;
};
#endif // !1
test1.h
#ifndef __test1_H__
#define __test1_H__
#include<iostream>
#include "test2.h"
using namespace std;
class test1
{
public:
    int add(int a,int b);
};


#endif // !__test1_H__

test2.cpp
#include "test2.h"

int sub(int a, int b)
{
    return a - b;
}
test1.cpp
#include "test1.h"

int test1::add(int a, int b)
{
    return a + b;
}
预处理指令

C\C++头文件在开始一般习惯使用#ifndef…..#define……#endif作为预处理标识符来防止头文件重复包含,如果不使用头文件就会一直递归包含下去,编译器在编译test2.h头文件时,遇到了#include "test1.h",就会打开test1.h进行编译,这相当于把test1.h的内容放到了#include "test1.h"处,而在编译test1.h时,又会遇到#include "test2.h",编译器又会打开test2.h进行编译,这样就会一直递归包含下去,所以预编译指令很有用哒!

回到问题

回到最开始的问题,怎么解决它呢,问了别人才知道,在test1 a;前面加上class test1;的前置声明,为什么要加呢?
对于test1.cpp,test1.cpp包含了test1.h,那么就会展开test1.h,而test1.h又包含了test2.h,那么也展开它,那么现在test1.cpp中就相当于

class test2
{
public:
    int sub(int a,int b);
    test1 a;
};
class test1
{
public:
    int add(int a,int b);
};
int test1::add(int a, int b)
{
    return a + b;
}

此时问题就显而易见了,test1 a;之前,根本就没有发现class test1的类定义,所以要在test2.h中test1 a;之前加前置声明。

test2.h
#ifndef __test2_H__
#define __test2_H__
#include<iostream>
#include "test1.h"
using namespace std;
class test1;
class test2
{
public:
    int sub(int a,int b);
    test1 a;
};
#endif // !1


但是当我们把test2.h的代码修改之后又会发现新的问题。
error C2079: “test2::a”使用未定义的 class“test1”。这里我们就要讨论一下类的前置声明和包含头文件的区别了。

类的前置声明与包含头文件的区别

类的前置声明只是告诉编译器有test1这种类型,但并没告诉编译器类的大小,成员函数,数据成员。而包含头文件则是执行到#include x.h时,马上去编译x.h,等于说是包含头文件告诉了编译器类的所有信息(大小,成员函数,数据成员)。所以,我们也得知,前置声明只能用指针来执行,因为指针的大小在编译器上的确定的。即为在test2类中想要使用test1类的对象,对象必须是指针类型的。test1 *a;

test2.h
#ifndef __test2_H__
#define __test2_H__
#include<iostream>
#include "test1.h"
using namespace std;
class test1;
class test2
{
public:
    int sub(int a,int b);
    test1* a;
};
#endif // !1
【Kubernetes】怎么根据pod找到关联的deployment呢 在文章中我们删除pod需要删除deployment,那么怎么根据pod找到关联的deployment呢。 阅读详情

相关推荐

史上最小白之RNN详解

1.前言 网上目前已经有诸多优秀的RNN相关博客,但是我写博客的出发点主要是为了加深和巩固自己的理解,所以还是决定自己再进行一下总结和描述,如有不正确的地方欢迎指正~ 2.区分RNN 循环神经网络(Recurrent Neural Network),递归神经网络(Recursive Neural Network),你有没有发现他们的缩写都是RNN,那他们两个是同一回事儿吗?网上有一些博客把这两就当...

Tink1995的博客 4万+

c++头文件互相包含的问题解析

c++中头文件互相包含的情况下代码处理方法

漫步者 1499

Spring Boot 实现多图片上传并回显,涨姿势了~

上传 Controller的代码非常简单,由于用了SpringMVC框架,所以直接用MultipartFile来接即可。由于是多图片上传所以用数组来接。此处应该注意参数名应该和<input>中的name值相对应: @RequestMapping("/pic") @ResponseBody publicResponseEntity<String>pic(MultipartFile[]pictures)throwsException{ ResponseEnti...

weixin_54556126的博客 893

C++ 两个.h需要互相包含时怎么办

c++要设计两个类,一个Line类,一个Point类,而且这两个类的声明与定义要分开写,而这两类在定义时都要用到另外一个类,所以我在Line.h里用了Point.h,在Point.h里用了Line.h,但是编译通过不了。 可以采用这个办法: 以Line.h为例: 在Line.h的前面加一个声明:class Point; 这样就可以使用Point类了,不过这 需要使用指针的形式,如Point...

望那伊人的博客 2382

迈德威视相机调用( 基于 Linux系统+ OpenCV )

迈德威视相机调用( 基于 Linux系统+ OpenCV )前言一、登录迈德威视官网,下载官方SDK二、代码调用与视频帧处理( 基于 OpenCV )总结 前言     此博客记录了迈德威视工业相机在 Linux 系统下的代码调用及其环境配置,通过 OpenCV 对视频帧进行处理。   一、登录迈德威视官网,下载官方SDK      迈德威视官网 : http://www.mindvision.com.cn/     1. 进入官网后,在服务支持中选择软件下载。    2. 选择Linux系统S.

kkkkkk0729的博客 5678

编写用户帮助/操作手册指南

一个新系统,需要写用户操作手册,该从何下笔?本篇是一篇教你编写用户帮助/操作手册的指南~

pytester的博客 3万+

头文件互包含问题

.h文件中不能出现头文件互包含(否则会编译不通过),.cpp文件可以随意包含头文件。 然而,若A.h要用到B.h的东西,B.h也要用到A.h的东西,可以在B.h中申明:class A;在B.cpp中再进行#include"A.h"

luyumiao1990的专栏 789

智能车图像处理22-进阶篇14--小s的判断

这篇文章中主要讲述智能车图像处理中 : 小s的判断方法。

taiyuezyh的博客 2566

解决头文件互相包含的情况

尽量少在.h文件中进行include,除非是实在避免不了(有一些继承等关系在)。我们如果只是使用它的一些方法就只需要在.cpp文件中include即可。比如说A需要include B,B需要include C,C还需要include A,这样形成环状必然会导致编译器报错。在这里声明我们要用A,而A的头文件我们反正在其他地方已经include了。这样的话是可以通过编译的。这是用来解决重复包含的问题,和上文提到的循环包含有所不同。在环的最后一处进行声明而不是include。在头文件开始时可以使用。

不要被失望的瞬间击败 1281

A算法的蒙特卡洛树搜索

A*算法的蒙特卡洛树搜索 作者:禅与计算机程序设计艺术 1. 背景介绍 在人工智能和游戏开发领域,搜索算法是一个非常重要的研究方向。其中A算法和蒙特卡洛树搜索是两种广泛应用的经典算法。A算法是一种启发式搜索算法,通过评估各个节点到目标节点的启发式代价来引导搜索方向,在

AI天才研究院 1734

PhotovoltaicPanelCleanlinessDetector:基于YOLOv8的光伏板清洁状态监测系统

data.yamlyaml复制编辑names:0: clean1: dust3: leaves4: shadow✅ 高精度污染识别✅ 具备实时检测与UI展示✅ 可本地化部署应用未来方向增加污染程度分级(轻度、中度、严重)加入时间序列分析(污染变化趋势预测)无人机集成巡检模块。

YOLO 275

2个办法解决头文件重复包含的问题

在一些大型项目中,各种头文件会相互包含,关系就显得错综复杂,同时由于文件的包含就是复制粘贴,那些重复包含的头文件就会使代码长度大大增加,那有没有什么办法解决这个问题呢?答案肯定是有的,这就涉及到条件编译了。

m0_74494481的博客 3655

7、布尔网络的基础定义

本文介绍了布尔网络的基础定义及其在系统生物学中的应用。布尔网络是一种描述复杂系统动态行为的数学模型,由布尔变量和布尔函数组成,能够模拟生物系统中基因调控、信号传导和细胞代谢等过程。文章详细阐述了布尔网络的基本结构、动力学特征(如状态转移图和吸引子),以及其在生物建模中的重要价值,并探讨了优化和简化技术(如Backward Boolean Equivalence)如何提升其计算效率。

yhn45678901的博客 262

使用预声明解决结构体互相引用以及头文件内容互相包含的问题

首先声明,简单的头文件重复包含问题不在此文的讨论范围之内,此问题可以通过下面的文件格式进行解决。 #ifndef __filename_h__ #define __filename_h__ /* code */ #endif  我们这里讨论的头文件互相包含是文件中的内容有互相引用的情况。比如test_a.h文件中定义了结构体TEST_A_S,test_b.h文件中定义了

嘟嘟专栏 1万+

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

解决C++中两个类的头文件互相包含问题

c++常见问题

weixin_44216359的博客 4546

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

C++中两个类的头文件互相包含问题

抽象概括下,就是A类定义在A.h中,A类中有个B*成员;B类定义在B.h,B类同样有A*成员        解决办法,就是A类定义前面,加上class  B;一行,进行声明,在B类定义前,加上#include“A.h”(交换也是一样)如果在B类前同样加上class A;的话,应该是不行的,经vc6一个程序验证,貌似会出现,类视图里找不到某一个类       这里如果在A.c

1万+

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

c++ 头文件互相包含问题

c++ error C2039 C2061 C3646 C4430 C2504 未知重写说明符 缺少类型说明符-假定为int 不是xxx的成员

weixin_44197671的博客 982

C++ 头文件互相包含引发的问题

最近一个项目在编码阶段,出现了一个编译错误,是由于头文件重复包含引发的,自己参考了网上的一篇博客, https://blog.youkuaiyun.com/u013321328/article/details/53229681 然后自己也进行了一下总结: 我有这样的两个cpp和两个头文件,为了方便描述问题,就不妨设为1.h 1.cpp 2.h 2.cpp 1.h中有如下的类声明 #in...

zhc的博客 553

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

今天写程序出现了一个让人蛋疼的错误,后来发现是由于头文件互相包含所引起的。 原本只是简单的以为头文件互相包含只会触发,头文件的递归包含。即,A包含B,所以才A的头文件里会将B的头文件内容拷贝过来,然后B里又包含A,又将A 拷贝一份,这样就会无限循环。(下图为A.h和B.h互相包含,进行预编译时的结果·) 对于上述的问题,windows中有特有的#pragma once。但是更通用的做

qq_19670785的博客 3938

头文件互相包含的问题

http://blog.youkuaiyun.com/ddl007/article/details/4862395 在C++中,关于CPP的头文件互相包含的问题很让人头疼,其实我们谁也不愿意弄的结构混乱,难以理解,但有时又是有必须的。      假定当前有两个头文件分别为 A.h  和 B.h,内容分别如下:      A.h内容为:      #ifndef  _A_H_      #define

miao6664659的专栏 823

C++:头文件递归包含问题(互相包含问题)

目录引言初始版本头文件守卫递归包含会怎么样为什么会出错前置声明是什么如何解决递归包含问题参考 引言 最近正在疯狂补技术债,以及疯狂赶项目…大一大二摸的鱼终归是要还的,也奉劝大家少摸鱼,不然临近找工作可能就会像我一样焦虑。 在写C++项目中,碰到一个非常古怪的问题,当我像往常一样引入一个头文件时,vscode居然给我报红了(我在vscode中使用的是clangd插件): 当时就觉得非常震惊,我从未没碰到过只是include一个头文件,居然会报错的情况,当我以为是插件的问题,像往常一样mkdir build &

NiGo的博客 8848

Linux C 头文件互相包含问题

头文件相互包含的问题 问题: 头文件交叉包含是否会导致递归包含,导致编译出错? 如果不会因为递归包含出错,那么交叉包含是不是完全没问题? 1.1 头文件交叉包含是否会导致递归包含,导致编译出错?(无#ifndef)   假若头文件a包含了头文件b、头文件b又包含了头文件a,那么在#include头文件a的时候,就可能会导致递归包含,从而导致编译出错; /* a.h */ #include "b...

希哈科技 1121

C/C++函数重复定义、头文件重复包含、互相包含问题

1、避免头文件重复包含//test.h此段宏的意思是如果定义了宏变量TEST_H_则不再定义它 #ifndefTEST_H_ #defineTEST_H_ //头文件内容 #endif或者//test.h告诉预编译器只包含一次 #pragmaonce2、避免重复定义 不要将函数定义放置在头文件里面,正确的做法是头文件放置函数声明,源文件放置函数定义。因为源文件...

weixin_34375054的博客 1044
上一篇: error C4430: 缺少类型说明符 - 假定为 int
下一篇: PAT1018 Public Bike Management
_IanXiao
博客等级 码龄12年 84粉丝 241原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值