以下是问题的源代码:
#include <stdio.h>
typedef struct Foo
{
int a;
Bar b;
} Foo;
typedef struct Bar
{
int a;
int b;
} Bar;
int main(void)
{
Foo f;
f.a = 1;
f.b.a = 2;
f.b.b = 3;
printf("%d %d %d\n", f.a, f.b.a, f.b.b);
return 0;
}
我想在Bar
结构中声明Foo
结构,它保持结构声明的顺序(Foo
struct是第一个)。但我不能,它在编译时发生了一些错误(一个是error: unknown type name 'Bar'
)。
怎么做?
答案 0 :(得分:8)
编译器需要能够确定Foo的大小。如果在定义Foo时未知Bar,则编译器无法确定Foo的大小。解决这个问题的唯一方法是使用指针,因为所有指针的大小都相同。
您可以使用结构的前向声明,然后将其作为指针引用。 这意味着Foo永远不会自动为Bar分配内存。因此,必须单独分配内存。
如果可以避免这种情况,请不要这样做。
#include <stdio.h>
#include <stdlib.h>
typedef struct Bar Bar;
typedef struct Foo Foo;
struct Foo
{
int a;
Bar * b;
};
struct Bar
{
int a;
int b;
};
void dynamic(void)
{
Foo f;
f.a = 1;
f.b = (Bar*)malloc(sizeof(Bar));
f.b->a = 2;
f.b->b = 3;
printf("%d %d %d\n", f.a, f.b->a, f.b->b);
free(f.b);
}
void automatic(void)
{
Foo f;
Bar b;
f.a = 1;
f.b = &b;
f.b->a = 2;
f.b->b = 3;
printf("%d %d %d\n", f.a, f.b->a, f.b->b);
}
int main(void)
{
dynamic();
automatic();
}
答案 1 :(得分:1)
Bar结构声明必须在Foo结构声明之前 - 如果您不想使用指针并分配内存。在C中,如果在结构中有另一个结构作为成员,则必须在之前声明另一个结构,以便编译器可以看到它。
答案 2 :(得分:-1)
多田!
#define Bar struct { int a; int b; }
typedef struct Foo
{
int a;
Bar b;
} Foo;
#undef Bar
typedef struct Bar
{
int a;
int b;
} Bar;
int main(void)
{
Foo f;
f.a = 1;
f.b.a = 2;
f.b.b = 3;
printf("%d %d %d\n", f.a, f.b.a, f.b.b);
return 0;
}
(请不要这样做)