这:
struct Nodetag {
/* ... */
};
创建一个名为struct Nodetag
. 同样,这个:
struct NODE {
/* ... */
};
创建一个名为struct NODE
.
在任何一种情况下,您都可以用声明包装该声明typedef
,为同一类型创建第二个名称:
typedef struct S {
/* ... */
} T;
这让您可以将类型称为 asstruct S
或 as T
。(你不能只调用它S
——尽管如果你使用 C++ 而不是 C 编程,你可以调用它。)
编写上述内容的等效方法是:
struct S {
/* ... */
};
typedef struct S T;
请注意,struct 标签和 typedef 名称位于不同的命名空间中(不是 C++ 意义上的“命名空间”一词),因为 struct 标签只能跟在关键字之后struct
。所以没有必要区分它们。
typedef struct Node {
/* ... */
} Node;
现在您可以将类型称为struct Node
或仅称为Node
.
添加这样的 typedef 并没有太大的优势;如果你喜欢,你可以省略它,只将类型称为struct Node
. (但是很多 C 程序员喜欢能够为类型使用一个单词的名称,而 typedef 是唯一的好方法(a#define
是另一种方法,但不是好方法。)
也可以省略标签名称,只使用 typedef:
typedef struct {
/* ... */
} Node;
这为您提供了一个匿名结构类型,然后立即创建Node
引用它的名称。但是使用这种方法,结构不能包含指向自身的指针,因为名称Node
直到结构定义结束后才可见。