C-转发声明并使用结构而不是指针

时间:2018-12-18 09:16:12

标签: c struct

我试图转发声明struct_A并在struct_B中使用它,而不是将其用作指针,而是将其用作结构。 在struct_B中,我引用了struct_B

我似乎无法正确解决-帮助? 这是我的代码

struct type_A_t;
typedef struct type_A_t type_A_t;

typedef struct type_B_t {
    type_A_t a;
};

struct  type_A_t{
    void (*cb)(type_B_t *b1);
    void (*cb)(type_B_t *b2);
};

我得到的错误是:

  

错误:字段“ type_A_t”的类型不完整

3 个答案:

答案 0 :(得分:3)

您不能那样做。但是在您的示例中,由于type_A_t只需要了解指向type_B_t的指针,为什么不这样切换呢?

typedef struct type_B_t type_B_t;
typedef struct type_A_t type_A_t;

struct  type_A_t {
    void(*cb)(type_B_t *b1);
    void(*cb)(type_B_t *b2);
};
typedef struct type_B_t {
    type_A_t a;
};

答案 1 :(得分:0)

  

我似乎无法正确解决-帮助?

因为无法完成。

编译器不知道该结构的大小。

尽管如此,对于指针而言,前向声明已足够:

typedef struct type_B_t {
    type_A_t a;  // error
    type_A_t* a; // OK
};

当然,如果在您的真实代码中,您可以切换顺序(如@Blaze的答案所述),就可以这样做。

答案 2 :(得分:0)

那是不可能的。要将类型用作成员,必须知道类型的大小,因此必须完全定义它。否则,sizeof(struct type_B_t)在定义后将是未知的,这是没有道理的。