Как `struct conn_queue` может быть использована до определения? - PullRequest
1 голос
/ 24 мая 2011

Этот код работает:

typedef struct conn_queue CQ;
struct conn_queue {
    CQ_ITEM *head;
    CQ_ITEM *tail;
    pthread_mutex_t lock;
    pthread_cond_t  cond;
};

Я думаю, что это должно быть так:

struct conn_queue {
    CQ_ITEM *head;
    CQ_ITEM *tail;
    pthread_mutex_t lock;
    pthread_cond_t  cond;
};
typedef struct conn_queue CQ;

Почему работает первая версия?

1 Ответ

2 голосов
/ 24 мая 2011

Вы на самом деле не используете структуру до ее определения, вы создаете синоним для нее.Пока вы не начнете что-то делать со структурой, компилятору не нужно будет знать, как он выглядит.

Ваш typedef содержит предварительное объявление:

typedef **struct conn_queue** CQ;

Когда вы начинаете использоватьструктура, компилятор должен знать, как он выглядит (sizeof, ссылки на переменные-члены и т. д.).

Итак, для следующего кода:

// This line is perfectly legal, even though foo is NEVER defined.
typedef struct foo fooType;

int main() {
  // If the following line is uncommented, an error will occur because:
  // storage size of ‘foo’ isn’t known
  // fooType foo;
  return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...