此代码有效:
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;
为什么第一个版本有效?
答案 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;
}