簡體   English   中英

`typedef struct X {}`和`typedef struct {} X`有什么區別?

[英]What's the difference between `typedef struct X { }` and `typedef struct { } X`?

C中這兩個聲明之間有什么區別:

typedef struct square{

   //Some fields

};

typedef struct{  

           //Some fields

} square;

第一個宣言:

typedef struct square {
    // Some fields
};

定義一個名為struct square的類型。 typedef關鍵字是多余的(感謝HolyBlackCat指出這一點)。 它相當於:

struct square {
   //Some fields
};

(事實上​​,您可以在聲明中使用typedef關鍵字而不定義類型名稱,這是C語法中的一個小故障。)

第一個聲明應該是:

typedef struct square {
    // Some fields
} square;

第二個宣言:

typedef struct {
    // Some fields
} square;

定義一個匿名struct類型,然后給它別名square

請記住, typedef本身並不定義新類型,只定義現有類型的新名稱。 在這種情況下, typedef和(匿名) struct定義碰巧組合成一個聲明。

struct X { /* ... */ };

這創造了一個新的類型。 所以你可以通過聲明這個新類型

struct X myvar = {...}

要么

struct X *myvar = malloc(sizeof *myvar);

typdef旨在命名一種類型

typedef enum { false, true } boolean;
boolean b = true; /* Yeah, C ANSI doesn't provide false/true keyword */

所以在這里,你將enum重命名為boolean。

所以當你寫作

typedef struct X {
    //some field
} X;

您將類型struct X重命名為X.當我說重命名時,它更像是另一個名稱。

提示,你可以簡單地寫:

typedef struct {
    //some field
} X;

但是如果你需要一個具有相同類型的字段(比如在鏈表中),你必須給你的結構命名

typedef struct X {
    X *next; /* will not work */
    struct X *next; /* ok */
} X;

希望這可以幫助 :)

編輯:正如Keith Thompson所說,typdef旨在創建別名:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM