Вы на самом деле не используете структуру до ее определения, вы создаете синоним для нее.Пока вы не начнете что-то делать со структурой, компилятору не нужно будет знать, как он выглядит.
Ваш 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;
}