想象一下这个非常人为的例子:(注意这是针对Arduino风格的C,而不是ANSI C):
typedef struct _node {
int value;
struct _node *next;
} node;
使用这个,我可以通过构建列表来构建两个节点的链接列表"向后":
node nodeB = { 2, (node *)0 }; // end of list
node nodeA = { 1, &nodeB }; // A.next => B
但相反,如果我想制作循环链接列表怎么办?这不会起作用:
node nodeA = { 1, &nodeB };
node nodeB = { 2, &nodeA };
因为在nodeA想要引用它时没有声明nodeB。
我可以在运行时构建链表(动态分配节点,然后设置next
链接)。但有没有办法在编译时获得有效的前向声明?
答案 0 :(得分:2)
这看起来像一个相当普通的情况,前方声明将起作用:
extern node nodeB;
node nodeA = { 1, &nodeB };
node nodeB = { 2, &nodeA };