在这些结构体的 typedef 中,解决以下循环依赖的最佳方法是什么?
注意C语言标签 - 我正在寻找标准gcc C的解决方案。
typedef struct {
char* name;
int age;
int lefthanded;
People* friends;
} Person;
typedef struct {
int count;
int max;
Person* data;
} People;
在这些结构体的 typedef 中,解决以下循环依赖的最佳方法是什么?
注意C语言标签 - 我正在寻找标准gcc C的解决方案。
typedef struct {
char* name;
int age;
int lefthanded;
People* friends;
} Person;
typedef struct {
int count;
int max;
Person* data;
} People;
typedef struct Person Person;
typedef struct People People;
struct Person {
char* name;
int age;
int lefthanded;
People* friends;
};
struct People {
int count;
int max;
Person* data;
};
请注意顶部两个“空白”typedef的添加(声明)。这告诉编译器新类型Person属于“struct Person”类型,因此在结构体People的定义中遇到它时,编译器知道它的含义。typedef struct People People;
typedef struct {
char* name;
int age;
int lefthanded;
People* friends;
} Person;
struct People {
int count;
int max;
Person* data;
};
如果您交换结构定义的顺序(将struct People移动到typedef Person之上),它将再次失败。这就是使其脆弱并且不建议使用的原因。typedef struct Bar Bar;
struct Foo
{
Bar bar;
};
struct Bar
{
int i;
};
由于在定义结构体Foo时尝试在其中使用不完整的类型Bar,以上代码将导致编译错误。换句话说,此时它还没有看到struct bar的定义,因此不知道为结构成员'bar'分配多少空间。
以下代码将会编译:
typedef struct Foo Foo;
typedef struct Bar Bar;
typedef struct FooBar FooBar;
struct Foo
{
Bar *bar;
};
struct Bar
{
Foo *foo;
};
struct FooBar
{
Foo foo;
Bar bar;
FooBar *foobar;
};
这段代码可以正常工作,即使Foo和Bar内部有循环指针,因为类型“Foo”和“Bar”已经被预先声明(但尚未定义),所以编译器可以构建一个指向它们的指针。
当我们定义FooBar时,我们已经定义了Foo和Bar的大小,因此我们可以在其中包含实际对象。我们还可以包含指向类型FooBar的自引用指针,因为我们已经预先声明了该类型。
请注意,如果将结构体FooBar的定义移到结构体Foo或Bar的定义之前,由于类型不完整,它将无法编译。
提前声明其中一个结构体:
struct people;
typedef struct {
/* same as before */
struct people* friends;
} Person;
typedef struct people {
/* same as before */
} People;
typedef struct Foo_ Foo;
typedef struct Bar_ Bar;
struct Foo_ {
Bar *bar;
};
struct Bar_ {
Foo *foo;
};
避免使用typedef struct
可能是一个好主意;
由于 Person
只需要指向 People
的指针,因此预先声明后者应该是可行的:
typedef struct People People;
struct People {
int count;
int max;
Person data[];
};
struct _People;
typedef struct {
char* name;
int age;
int lefthanded;
struct _People* friends;
} Person;
struct _People {
int count;
int max;
Person data[1];
};
Person data[];
是标准的吗?[]
的可变数组成员是标准的。它必须是至少有另一个成员的结构类型的最后一个元素。 - Jonathan Lefflerstruct People_struct;
typedef struct {
char* name;
int age;
int lefthanded;
struct People_struct* friends;
} Person;
typedef struct People_struct {
int count;
int max;
Person data[];
} People;
struct people friends
而不是指针吗?这对我来说会产生错误。例如:struct people;
typedef struct { struct people friends;} Person;
和typedef struct people { Person person;};
- Ramana Reddy