gpt4 book ai didi

c - 不同 header 中的结构相互引用

转载 作者:行者123 更新时间:2023-11-30 20:01:16 25 4
gpt4 key购买 nike

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

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

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

有人可以帮忙吗?

最佳答案

在 C 语言中,可以在两个或多个结构之间进行循环引用,或者从一个结构对其自身进行循环引用。请注意,引用只能通过指针进行:一个结构 X 不能嵌入另一个结构的实例,同时 X 嵌入 Y 的实例。但是,X 可以有一个指向 Y 的指针,而 Y 可以指向 X,或者嵌入一个结构的副本十.

C 中允许循环引用的机制是不完整结构类型。在 C 中,您可以在声明中使用 struct ,而无需定义结构体,如下所示:

struct foo *bar;  // foo has never been seen before.

foo 标识符是“结构标记”。稍后在相同范围内重新声明包含主体的相同结构标记将完成类型:

struct foo { int member; };  // foo is now complete

有了这个我们可以做到:

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 别名。上述引用技巧不能使用 typedef 名称来实现;结构标签是必不可少的。

只有具有标记的结构才可以声明两次或多次:第一次不完整,然后完全。没有标签的结构体的声明是匿名的;这样的声明每次出现都会发明一个新的、唯一的结构类型。

关于c - 不同 header 中的结构相互引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34926018/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com