【问题标题】:Two structs in different header files, both using the other不同头文件中的两个结构,都使用另一个
【发布时间】:2012-07-13 03:15:44
【问题描述】:

我已经浏览了关于hear 的一堆线程以及我在 Google 上找到的一堆其他线程。我似乎仍然无法做到这一点。

//Room.h
#ifndef ROOM_H
#define ROOM_H

#include "Door.h"

typedef struct {
   Door* doors[3];

} Room;

#endif

//Door.h
#ifndef DOOR_H
#define DOOR_H

#include "Room.h"

typedef struct {
   Room* room1;
   Room* room2;
} Door;

//main.c
#include <stdio.h>
#include "Room.h"
int main() { ... }

我已经尝试将它添加到 Door.h 的顶部

typedef struct Room room1;
//typedef struct Room* room1;
//typedef stuct Room;
//typedef struct Room*;

所有人都给了我这个错误:

“未知类型名称‘房间’”

我想将这些结构保持在单独的头文件中。

【问题讨论】:

    标签: c struct header-files


    【解决方案1】:

    试试这样:

    typedef struct Room Room;
    typedef struct Door Door;
    
    struct Room{
       Door* doors[3];
    };
    
    struct Door{
       Room* room1;
       Room* room2;
    };
    

    前两行是允许它们相互引用的类型声明。

    在头文件中如何分隔它们并不重要,只要前两行在前即可。


    在您的情况下,它们可以按如下方式拆分:

    room.h

    typedef struct Door Door;
    
    struct Room{
       Door* doors[3];
    };
    

    door.h

    typedef struct Room Room;
    
    struct Door{
       Room* room1;
       Room* room2;
    };
    

    【讨论】:

    • 这不起作用。顺便说一下,它们位于两个单独的头文件中。我只是扔了一个字符串变量,看看我是否可以从另一个结构访问它,但这是不行的。
    • 实际的struct 定义不应使用typedef 以避免typedef 重新定义错误。
    • @CoolJoe 我编辑了如何将它们分成标题。但我不明白你遇到的第二个问题。
    • 在 Rooms 结构中,我现在有一个字符串 chart。在我的主目录中,我创建了一个带有 room.t = "test"; 的新房间。在我的 door.h 文件中,我有这个功能: void printthis(Room room) { printf("%s", room.t);它给了我这个错误:“在不是结构或联合的东西中请求成员‘t’”
    • 请注意,这种方法将 Door 的 typedef 放入 room.h 并将 Room 的 typedef 放入 door.h。这是一个等待发生的维护地狱,特别是如果你有更多这样的事情。
    【解决方案2】:

    结构引用的C方式:

    房间.h

    typedef struct Room_s {
      struct Door_s * doors[3];
    } Room_t;
    

    门.h

    typedef struct Door_s {
      struct Room_s *room1;
      struct Room_s *room2;
    } Door_t;
    

    【讨论】:

    • 谢谢!老实说,我现在因为不尝试这个而觉得自己像个菜鸟。我之前也遇到过同样的问题,除了我试图在其自身中使用一个结构,而我正是这样做的,它确实有效......
    • 为什么能解决这个问题?一个结构仍将在另一个之前声明?
    【解决方案3】:

    与其创建匿名结构并对其进行类型定义,不如为结构指定特定名称,如下所示:

    common.h

    typedef struct Door_ Door;
    typedef struct Room_ Room;
    

    房间.h

    #include "common.h"
    
    struct Room_ {
      Door* doors[3];
    };
    

    门.h

    #include "common.h"
    
    struct Door_ {
      Room *room1;
      Room *room2;
    };
    

    不过,如果您打算将room.hdoor.h 始终一起使用,我只需制作一个文件来放入所有定义。

    【讨论】:

    • 这有点奇怪。我将有其他结构彼此做同样的事情,我不想有“common1.h”、“common2.h”等。我也希望这些都在他们自己的头文件中。编辑:我明白你将所有定义放在一个文件中的意思,即使它们都不相互使用。仍然像有另一种方式一样接缝......
    • 我刚开始测试这个,确实它也有效。 +1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多