C - вперед объявить и использовать структуру, а не указатель - PullRequest
0 голосов
/ 18 декабря 2018

Я пытаюсь перенаправить объявление 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 голосов
/ 18 декабря 2018

Вы не можете этого сделать.Но в вашем примере, поскольку 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;
};
0 голосов
/ 18 декабря 2018

Это невозможно.Чтобы использовать тип в качестве члена, размер типа должен быть известен, поэтому он должен быть полностью определен.В противном случае sizeof(struct type_B_t) будет неизвестно после его определения, что не имеет смысла.

0 голосов
/ 18 декабря 2018

Кажется, я не могу понять это правильно - помогите?

Потому что это невозможно сделать.

Компилятор не знает размер этой структуры.

Впрочем, для указателей достаточно предварительного объявления:

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

Конечно, если в вашем реальном коде вы можете изменить порядок, как упоминает ответ @ Blaze, то сделайте это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...