Могу ли я сделать круговые ссылки с константными структурами?

Мне разрешено делать это на 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 константой, иначе ваше определение будет отбрасывать постоянные квалификаторы.

Демоверсия