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

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

c

2个回答

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

John_ToString
John_ToString 回复anewbies: 不是编译器不支持,是编译器无法支持,因为你的逻辑再任何情况下都不可能成立的...好好想想
接近 5 年之前 回复
anewbies
anewbies 在程序与处理过程中,假设编译器先将a.h头文件 包含进b.h中,那么之后会发生什么情况呢??? 此时的a.h可能已经包含了b.h中的内容,从而导致类型重定义,以及头文件多次包含的 问题,即就是你的思路在程序与处理这个过程中就过不去...你好,首先谢谢你这么详细的解释,并不辞辛劳把我说的用代码敲出来,(我用手机发布的,都没有敲出来),真的是非常感谢,您说的就是编译器不支持这种逻辑,那一般像我这种情况有什么好的处理办法呢?
接近 5 年之前 回复

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

/*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中的内容,从而导致类型重定义,以及头文件多次包含的
问题,即就是你的思路在程序与处理这个过程中就过不去...

John_ToString
John_ToString 回复anewbies: no no no!!!这不是编译器的bug,没有人能够开发出一款编译器解决你的问题的,建议再次好好看看我的以上分析,看看是否合理...
接近 5 年之前 回复
anewbies
anewbies 您好,难道我发现了个编译器的BUG?您说我的逻辑是错误的,我不知道错在哪了?请帮帮我
接近 5 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐