不同标题中的结构相互引用

时间:2016-01-21 14:09:13

标签: c pointers struct

我希望有一个结构,其中包含指向另一个结构的指针,该结构又有一个函数指针,函数参数是指向第一种结构类型的指针,但我正在努力解决这些引用。结构定义位于不同的头文件中,并且必须可用于整个项目中的其他代码。

在一个简化的例子中,我主要有:

#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中是未知的

有人可以帮忙吗?

1 个答案:

答案 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标签是必不可少的。

只有具有标记的结构可以被声明两次或更多次:第一次不完整,然后完全不完整。没有标记的结构的声明是匿名的;这样的声明每次出现时都会发生一种新的,独特的结构类型。