在定义之前如何使用`struct conn_queue`?

时间:2011-05-24 07:37:45

标签: c syntax

此代码有效:

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 个答案:

答案 0 :(得分:2)

在定义结构之前,你并没有真正使用它,你正在为它创建一个同义词。在你开始对结构做一些事情之前,编译器不需要知道它的样子。

您的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;
}