我们经常会看到声明结构体的两种形式,以Foo和Bar为例:
struct Foo
{
...
};
和
typedef struct Bar
{
...
}Bar;
这两个的区别在哪里呢?在于声明。
当我们要声明一个Foo型结构的变量f时,以下做法是错的:
Foo f;
正确的声明方法如下:
struct Foo f;
这是因为在c语言中,形如struct, enum和union一类,被称为tag identifiers
. 所以身为struct的Foo就在tag namespace里,要声明类型为Foo的变量,需要加上tag identifiers也就是struct. 但要是一个程序中需要多次用到Foo这种结构类型,每次声明变量都这样,显然比较复杂,所以我们想到用typedef.
typedef struct Foo Foo;
Foo f;
这比之前简单不少,如果我们把第一句typedef和声明结合在一起,细心地读者就会发现,这不就是上面的Bar么?嘿嘿。