我是否允许使用常量结构进行循环引用?

时间:2017-09-18 23:20:31

标签: c struct circular-reference

我可以在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
};

我可以让我的程序在没有这个的情况下工作,它只是方便。

2 个答案:

答案 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声明以使nextprev保持不变,否则您的定义会丢弃常量限定符。

Demo.