我可以在C99中这样做吗?
typedef struct dlNode {
dlNode* next,prev;
void* datum;
} dlNode;
const static dlNode head={
.next=&tail,
.prev=NULL,
.datum=NULL
};
const static dlNode tail={
.next=NULL,
.prev=&head,
.datum=NULL
};
我可以让我的程序在没有这个的情况下工作,它只是方便。
答案 0 :(得分:15)
你可以,你必须转发声明tail
才能让它发挥作用:
typedef struct dlNode {
struct dlNode* next;
struct dlNode* prev;
void* datum;
} dlNode;
const static dlNode tail;
const static dlNode head={
.next=&tail,
.prev=NULL,
.datum=NULL
};
const static dlNode tail={
.next=NULL,
.prev=&head,
.datum=NULL
};
答案 1 :(得分:5)
绝对允许你这样做:添加tail
的前向声明,C将它与后来的定义合并:
typedef struct dlNode {
const struct dlNode* next, *prev;
void* datum;
} dlNode;
const static dlNode tail; // <<== C treats this as a forward declaration
const static dlNode head={
.next=&tail,
.prev=NULL,
.datum=NULL
};
const static dlNode tail={ // This becomes the actual definition
.next=NULL,
.prev=&head,
.datum=NULL
};
请注意,您应该修正struct
声明以使next
和prev
保持不变,否则您的定义会丢弃常量限定符。