c语言头文件包含问题-关于头文件包含的问题,请教大家!

问题描述

关于头文件包含的问题,请教大家!

程序源文件中有两个头文件,头文件A中定义了一个结构体类型_tag_addr,并在头文件开头使用了#ifnodef #define预编译宏;头文件B中定义了一个结构体类型_tag_bddr,也在头文件开头使用了预编译宏,现在的问题是我要在头文件A中声明一个_tag_bddr类型的变量,在头文件B中声明一个_tag_addr类型的变量,所以要在头文件A开头包含头文件B,也要在头文件B中包含头文件A,但是这样做编译时头文件A报错,说是没有_tag_bddr类型。请问这是什么情况,需要怎么处理?

解决方案

补充一句,此时的external关键字不能用,因为是在头文件中,而头文件是不参与编译的

解决方案二:

VC++中的头文件包含问题
c++ 头文件包含问题
头文件包含问题

解决方案三:

//以下是我的代码看看:

/*b.h*/
#ifndef B_H
#define B_H
//#include "a.h"

typedef struct _Tag_Bddr
{

}_tag_bddr;

//_tag_addr _taga;
#endif

/*a.h*/
#ifndef A_H
#define A_H
#include "b.h"
typedef struct _Tag_Addr
{

}_tag_addr;

_tag_bddr _tagb;
#endif

/*main.cpp*/
#include
#include "a.h"
#include "b.h"
using namespace std;

void main()
{

}

首先你的想法编译器是无法实现的,请仔细看看我的代码,包括注释,那么你想在两个头文件中互相包另一个的头,这是不可能的,
那么首先你应该清楚编译器在编译连接之前都干了什么,首先是预处理(预编译)过程,即将所有的宏包含语句头文件代替为相应的代
码以及常量的无类型替换,若果按你的想法的话它之所以不能够被编译器支持是因为它在逻辑上是不能够成立的(即就是c标准是不支
持的),也并不是说编译器厂商为了所谓的各种优化效率考虑的原因,因为编译器不能够支持你错误的逻辑。建议你再次好好思考一下
你思路的漏洞。**_就上面的代码举个你所谓的双重包含的例子:考虑这么一种情况,你要在a.h里面定义一个b.h里面定义的b结构体_**
的一个变量,这是可以的,你必须得在a.h中包含b.h头文件,或者用extern关键字,但是,注意我说的是但是,同时呢你又想在b.h中
定义一个a.h中a结构体的一个变量,那么你同样必须得将a.h头包进b.h中,如此一来,在程序与处理过程中,假设编译器先将a.h头文件
包含进b.h中,那么之后会发生什么情况呢??? 此时的a.h可能已经包含了b.h中的内容,从而导致类型重定义,以及头文件多次包含的
问题,即就是你的思路在程序与处理这个过程中就过不去...

时间: 2024-08-17 14:06:07

c语言头文件包含问题-关于头文件包含的问题,请教大家!的相关文章

windowssocket编程-请问ICMP_ECHO是系统预定义的吗,包含在哪个头文件里呢?

问题描述 请问ICMP_ECHO是系统预定义的吗,包含在哪个头文件里呢? 在编写一个ping程序时,填充ICMP包的内容,要将类型设置为ICMP响应包,即icmp_hdr->i_type =ICMP_ECHO; 但是IDE提示未定义的标识符ICMP_ECHO未定义,这是怎么回事呢 解决方案 知道了,,,,翻到了另一个人的代码,原来要自己定义, #define ICMP_ECHO 8 解决方案二: 自挽,,,,此贴终结

mysql5.7在centos下编写c语言程序操作数据库时,头文件#include<mysql/mysql.h>报错

问题描述 mysql5.7在centos下编写c语言程序操作数据库时,头文件#include<mysql/mysql.h>报错 mysql5.7在centos下编写c语言程序操作数据库时,头文件#include报错 解决方案 这是没有找到plugin_auth_common.h文件啊,你对照一下目录下面有没有这个文件啊...另外这个/usr/include/mysql/mysql目录看起来有点奇怪啊,你是不是多建了一层mysql目录

c++模板编程问题-怎样用DEV~C++在.cpp文件中插入一个.c文件,用在.cpp的头文件中去

问题描述 怎样用DEV~C++在.cpp文件中插入一个.c文件,用在.cpp的头文件中去 .cpp文件: #include #include using namespace std; int main() { template m; m.CreateList(10); for(int i = 0; i < length; i++) cout << elem[i] << " "; cout << endl; m.Insert(2, 7); for

wireshark c 文件读取-怎么用C语言读取WireShark捕获的数据包文件

问题描述 怎么用C语言读取WireShark捕获的数据包文件 怎么用C语言读取WireShark捕获的数据包文件,要求能分析出以太网头部,Ip头部,TCP头部,并提取出数据部分,下面是我写的一段代码,但是读的不对,希望高手指点//.pcap文件//#ifndef xiaohouzi//#define xiaohouzi#ifndef LITTLE_ENDIAN#define LITTLE_ENDIAN (1)#include typedef unsigned int bpf_u_int32;ty

C语言实现MATLAB 6.5中M文件的方法

众所周知,MATLAB是一个功能强大的数学软件,擅长于用矩阵运算完成各种数学功能.但是其程序需要在MATLAB环境下解释执行,效率不高.如果能将它强大的函数库用于C语言,利用C来编译执行,MATLAB将能发挥更大的作用.所以,MATLAB从5.0开始已经提供了与外部C/C++程序的应用程序接口,为利用C语言调用MATLAB的函数提供了可能.但是MATLAB的接口发展很快,到MATLAB 6.5已经提供了对VC 7.0的支持,同时对C的接口相对于5.X版本有了一定的改变. 在MATLAB当中,我们

c语言-C语言中A文件定义的文件指针,如何才能在B文件中也可以写入信息

问题描述 C语言中A文件定义的文件指针,如何才能在B文件中也可以写入信息 image.c和rtp.c都不是主函数,在image.c中定义了一个文件指针,但我想把rtp.c中的信息写入这个文件.简单就是在A文件中定义了一个指针文件,想把B文件中的信息写入指针文件.你可能问我为什么不直在B文件中定义,因为也要写入A文件中信息,像我之前写的运行时会提示rtp.c中的文件指针是未定义的标识符. 应该怎么写才是正确,麻烦知道的人给点指导,谢谢 解决方案 通过extern在rtp.c中声明该文件指针为外部指

求助:调用包含并行计算的m文件编译成的动态链接库

问题描述 求助:调用包含并行计算的m文件编译成的动态链接库 请问如何在c++环境下调用包含并行计算(parfor)的MATLAB编译好的动态链接库(C++ shared library)?当m文件中不包含matlabpool open时,动态链接库是可以成功调用的,但是一旦m文件中包含matlabpool open,调用时会出现错误: "XXX exited with code -529697949" 求大神帮忙,如何调用含有并行计算的MATLAB动态链接库? 我的环境是:win7,Q

c语言-C语言 文件读写fscanf 不能读取文件第一行

问题描述 C语言 文件读写fscanf 不能读取文件第一行 我在做USACO的训练题 按照要求写了个读文件的程序,但是出了一点我不能理解的bug 希望老师指点指点 程序: int main () { char comet[6]; char group[6]; FILE *input; input=fopen ("ride.in", "r"); fscanf (input, "%sn%s", comet, group ); \fscanf (inp

c语言 把邻接矩阵的相关数据存入文件中

问题描述 c语言 把邻接矩阵的相关数据存入文件中 MGraph CreatMG(MGraph g) { int i,j,k,n; cout<<"输入顶点数和边数"; cin>>g.n>>g.e; for(i=0;i<g.n;i++) { cout<<"序号为"<<i<<"的值"; cin>>g.vexs[i].data; g.vexs[i].no=i; }