C在定义之前声明结构

时间:2014-10-03 23:53:18

标签: c struct

以下是问题的源代码:

#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')。

怎么做?

3 个答案:

答案 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;
}

(请不要这样做)