想象一下这个高度人为的示例:(请注意,这是针对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链接)。但是有没有办法在编译时获得有效的前向声明?

最佳答案

这看起来像一个非常普通的情况,前向声明将起作用:

extern node nodeB;
node nodeA = { 1, &nodeB };
node nodeB = { 2, &nodeA };

08-16 13:19