Мне разрешено делать это на 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
};
Я могу сделать свою программу без этого, это было бы удобно.
Ответ 1
Вы можете, просто переслать declare 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
};
Ответ 2
Вам абсолютно разрешено это делать: добавьте объявление вперед 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
константой, иначе ваше определение будет отбрасывать постоянные квалификаторы.
Демоверсия