我希望有一个结构,其中包含指向另一个结构的指针,该结构又有一个函数指针,函数参数是指向第一种结构类型的指针,但我正在努力解决这些引用。结构定义位于不同的头文件中,并且必须可用于整个项目中的其他代码。
在一个简化的例子中,我主要有:
#include "a.h"
typedef struct {
int x;
int (*func)(a_t * a);
int y;
} z_t;
在a.h中:
#ifndef A_H_
#define A_H_
#include "z.h"
typedef struct {
int b;
int c;
z_t * z;
} a_t;
#endif /* A_H_ */
并在z.h中:
#ifndef Z_H_
#define Z_H_
#include "a.h"
typedef struct {
int x;
int (*func)(a_t * a);
int y;
} z_t;
#endif /* Z_H_ */
我最终得到了循环#includes,类型a_t在z.h中是未知的
有人可以帮忙吗?
答案 0 :(得分:4)
在C中,您可以在两个或多个结构之间或从结构到自身之间具有循环引用。请注意,引用只能通过指针:一个结构X不能嵌入另一个的实例,同时X嵌入Y的实例。但是,X可以有一个指向Y的指针,而Y可以指向X,或者嵌入一个副本X
在C中允许循环引用的机制是不完整的结构类型。在C中,您可以在声明中使用while ((str = br1.readLine()) != null)
userstr.add(str.split(",")[0]);
,而无需定义结构体,如下所示:
struct
struct foo *bar; // foo has never been seen before.
标识符是" struct标记"。稍后在 包含正文的同一范围内重新声明相同的struct标记将完成该类型:
foo
我们可以这样做:
struct foo { int member; }; // foo is now complete
在您的代码中,您还没有使用过单个struct标记;您的所有结构类型都是匿名的,并且您依赖于struct list_node {
struct list_node *next, *previous; // self reference
};
struct foo {
struct bar *bar_ptr;
};
struct bar {
struct foo *foo_ptr; // mutual references
};
别名。使用typedef
名称无法播放上述参考技巧; struct标签是必不可少的。
只有具有标记的结构可以被声明两次或更多次:第一次不完整,然后完全不完整。没有标记的结构的声明是匿名的;这样的声明每次出现时都会发生一种新的,独特的结构类型。