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;
雖然這樣也算是起了個名字,但是這樣聲明的結構體不能嵌套,即內部不能包含自己。
一點吐槽:
很多國內的C/C++教材喜歡給你講各種花里胡哨的方式,告訴你這樣定義也可以那樣也可以。但是在實際的工作中,代碼在能夠運作的同時還要人能看得懂,所以一定要簡潔明了,不要用太多奇淫技巧。
