prev up next   top/contents search

comp.lang.c FAQ 列表· 问题 1.15

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 *bpointerstruct 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


prev up next   contents search
关于此 FAQ 列表   关于 Eskimo   搜索   反馈   版权

Eskimo North 托管