Q如何定义一对相互引用的结构?我试过
typedef struct { int afield; BPTR bpointer; } *APTR; typedef struct { int bfield; APTR apointer; } *BPTR;但编译器在第一个结构声明中使用BPTR时并不知道它。
A正如在问题 1.14 中所述,问题不在于结构或指针,而在于 typedef。首先,给两个结构打上标签,然后不使用 typedef 定义链接指针
struct a { int afield; struct b *bpointer; }; struct b { int bfield; struct a *apointer; };编译器可以接受字段声明struct b *bpointer在struct a内部,即使它还没有听说过struct b. (struct b此时是“不完整的”。) 有时有必要在该成对声明前加上空声明
struct b;以隐藏声明(如果在内部作用域中)来自不同struct b在外部作用域中。
使用 struct 标签声明两个结构后,您可以分别声明 typedef
typedef struct a *APTR; typedef struct b *BPTR;
或者,您可以在 struct 定义之前定义 typedef [脚注],在这种情况下,您可以在声明链接指针字段时使用它们
typedef struct a *APTR; typedef struct b *BPTR; struct a { int afield; BPTR bpointer; }; struct b { int bfield; APTR apointer; };
另请参阅问题 1.14。
参考文献: K&R2 Sec. 6.5 p. 140
ISO Sec. 6.5.2.3
H&S Sec. 5.6.1 p. 132