anewbies
anewbies
采纳率25%
2015-11-01 07:11 阅读 1.8k

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

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

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

2条回答 默认 最新

  • John_ToString John_ToString 2015-11-01 08:03

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

    点赞 1 评论 复制链接分享
  • John_ToString John_ToString 2015-11-01 07:56

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

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

    点赞 评论 复制链接分享

相关推荐