我已经看过有关相互指针的结构的问题,我尝试了很多东西,但我无法解决我的问题。我的大脑正好燃烧!
我有两种不同的结构/类型:set_t
和node_t
#ifndef _SETH_
#define _SETH_
#include "node.h"
#include "list.h"
typedef struct {
list_t* list;
}set_t;
set_t* createSet(node_t*);
set_t* findSet(node_t*);
set_t* unionSet(node_t*, node_t*);
#endif
我的set_t结构中没有任何node_t,但是我使用node_t作为参数,所以我可以看到node.h。 List是节点的链接列表,但是现在这与我的问题无关。
#ifndef _NODEH_
#define _NODEH_
//?? #include "set.h"
typedef struct set_t s;
typedef struct node_t{
int color;
int dist;
int key;
int date;
int end;
s* set;
struct node_t* father;
}node_t;
node_t* createNode(int);
#endif
在beggining中,我使用在node.h中包含set.h,因为我在我的节点struct中使用了一个set。但我对包含有某种“循环”。 所以我试着用这个指令:
typedef struct set_t s;
以避免循环问题。
但这次我有另一个问题/警告,我想我明白了: 当我做类似的事情时(让我们假设我们有一个node_t * n):
set_t* s = (set_t*)malloc(sizeof(set_t));
n->set= s;
我有一个不兼容的指针类型警告,可能是因为s是一个set_t *但是n-> set是一个s * ...
我做错了什么?当你想在x.h中包含x.h和在x.h中包含y.h时,我真的想了解它是如何工作的... 同样的事情,如果y.h需要x.h,z.h需要y.h,x.h需要z.h .. 我真的希望我能够清楚地帮助你们。
答案 0 :(得分:1)
编译器将类型set_t
视为与typedef struct {
list_t * list;
} set_t;
类型不同的东西。
要对齐此操作,请执行以下操作:
在set.h中更改
typedef struct Set {
list_t* list;
} set_t;
是
typedef struct set_t s;
在node.h中更改
typedef struct Set set_t; // True forward declaration of set_t.
是
s * set;
和
set_t * set;
是
typedef
更新
放弃所有那些无用的#ifndef _SETH_
#define _SETH_
#include "node.h"
#include "list.h"
// define type "struct Set"
struct Set {
struct List * list; // defintion of struct List to be adjusted in list.h
};
struct Set * createSet(struct Node*);
struct Set * findSet(struct Node*);
struct Set * unionSet(struct Node*, struct Node*);
#endif
或许会让事情变得更清晰。您的代码将如下所示:
set.h
#ifndef _NODEH_
#define _NODEH_
// declare forward type "struct Set"
struct Set;
// define type "struct Node"
struct Node {
int color;
int dist;
int key;
int date;
int end;
struct Set * set;
struct Node* father;
};
struct Node * createNode(int);
#endif
node.h
table name also permission