C/C++中的结构体声明: struct 和 typedef struct 用法
之前一直被C/C++中的结构体的定义弄晕,今天终于认认真真整理了一次。
结构体的常规定义与创建
无 typedef 的声明方式
首先常规结构体的定义,你肯定已经十分清楚:
struct Person{
int age;
string name;
};
这里Person是你声明的这个结构体的名字,即一种类型,如同int之类的。
如果你想声明几个Person的变量的话有两种方式:
// 1. 在声明之后立刻创建
struct Person {
int age;
string name;
} person_a, person_b;
// 这里 person_a 都是实际的 variables 啦!
// 2. 随后需要的时候再创建,给出C中的定义方法
struct Person person_c;
有 typedef 的声明方式
在C中,创建结构体都要在前面加多一个struct,有点累赘。当然,有简单的办法,就是加上一个typedef。
typedef struct Person {
int i;
string name;
} Ren;
// 这里 Ren 不是 variable, 而是一个类型名
// 通过这种方式声明的结构体就可以较为简洁地创建变量
Ren person_d;
typedef 并没有实际参与到结构体的定义,而是仅仅给你创建的结构体起了个外号。在这个例子中 struct Person 的外号就是 Ren
其他声明方法介绍
上面介绍的都是十分常规的的声明方式,也是推荐使用的 best practice。但容易混淆的是一些比较特殊的声明方式中,例如匿名结构体等,实际的效果可能不是那么的直观。
- 匿名结构体
struct {
int age;
string name;
} p1, p2;
这里p1, p2是实际的变量不是变量类型。实际变量类型的变量类型是这个结构体,但这个结构体你没起名字。如果你不在声明后进行初始化的话就再也没有机会了。这种适合那种很简单的结构体或者你真的就仅仅用这一次的结构体。
- 匿名结构体 + typedef
typedef struct {
int age;
string name;
} Person, Ren;
神奇了,这里的Person、Ren和上面的p1, p2在一个位置,但是Person和Ren是变量类型了而不是具体的变量,在大部分情况下可以和常规声明的结构体以同样的方式使用:
Person p;
Ren ren;
虽然这样也算是起了个名字,但是这样声明的结构体不能嵌套,即内部不能包含自己。