这些都不适用于C++
。在C++
中,请优先考虑:
struct Foo
{
. . .
};
以下内容仅适用于C
。
从技术上讲,struct Foo {};
对于大多数目的来说已经足够了。然而,由于每次使用类型Foo时都必须重复使用struct
,因此有点啰嗦。
struct Foo {}
void func( struct Foo* foo );
使用typedef可以使这个过程更简单。
struct Foo { };
typedef struct Foo Foo;
void func( Foo* foo );
这可以进一步缩短:
typedef struct Foo { } Foo;
void func( Foo* foo );
当进行一行代码时,也可以使用以下语法:
typedef struct { } Foo;
void func( Foo* foo );
这是创建一个匿名的
struct
,然后给它命名为Foo。你最常见到这种情况是在
enum
中。
typedef enum { } Bar;
通常情况下,初始冗余的Foo被保留是有原因的。这是创建自引用结构(如链表)的唯一方法。
typedef struct Node
{
Node* next;
} Node;
如果省略了初始的
Node
,就没有办法声明一个指向这个结构体的指针。技术上讲这也是有效的,但现在你必须想出两个名称,而不是只有一个。
typedef struct node_
{
node_* next;
} Node;
那么为什么要使用:
typedef struct Foo { } Foo;
为了保持一致性。这种声明风格涵盖了所有的基础,因此在声明结构时您永远不必考虑它。