C/C++中的結構體聲明: struct 和 typedef struct 用法


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。但容易混淆的是一些比較特殊的聲明方式中,例如匿名結構體等,實際的效果可能不是那么的直觀。

  1. 匿名結構體
struct {
    int age;
    string name;
} p1, p2;

這里p1, p2是實際的變量不是變量類型。實際變量類型的變量類型是這個結構體,但這個結構體你沒起名字。如果你不在聲明后進行初始化的話就再也沒有機會了。這種適合那種很簡單的結構體或者你真的就僅僅用這一次的結構體。

  1. 匿名結構體 + typedef
typedef struct {
   int age;
   string name;
} Person, Ren;

神奇了,這里的Person、Ren和上面的p1, p2在一個位置,但是Person和Ren是變量類型了而不是具體的變量,在大部分情況下可以和常規聲明的結構體以同樣的方式使用:

Person p;
Ren ren;

雖然這樣也算是起了個名字,但是這樣聲明的結構體不能嵌套,即內部不能包含自己。

一點吐槽:

很多國內的C/C++教材喜歡給你講各種花里胡哨的方式,告訴你這樣定義也可以那樣也可以。但是在實際的工作中,代碼在能夠運作的同時還要人能看得懂,所以一定要簡潔明了,不要用太多奇淫技巧。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM