2014-11-03 125 views
5

什麼在C這兩個聲明之間的區別:`typedef struct X {}`和`typedef struct {} X`有什麼區別?

typedef struct square{ 

    //Some fields 

}; 

typedef struct{ 

      //Some fields 

} square; 
+0

我知道,我的結構中有一些字段,我只需要知道結構底部和頂部名稱的區別... – PlayHardGoPro 2014-11-03 22:42:33

+0

[爲什麼我們應該在C中經常鍵入一個結構?] (http://stackoverflow.com/questions/252780/why-should-we-typedef-a-struct-so-often-in-c) – Raedwald 2016-10-17 15:48:01

回答

10

第一個聲明:

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定義恰好合併爲一個聲明。

+3

另外,在第一種情況下'typedef'是多餘的,什麼都不做。 – HolyBlackCat 2014-11-03 22:47:10

+0

@HolyBlackCat:我完全錯過了。謝謝。 – 2014-11-03 22:53:52

+0

謝謝!真的幫了! – PlayHardGoPro 2014-11-03 22:57:02

2
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 */ 

,重命名的枚舉布爾值。

所以,當你寫

typedef struct X { 
    //some field 
} X; 

當我說重命名,它更多的其他名稱重命名類型結構X到十。

提示,你可以簡單的寫:

typedef struct { 
    //some field 
} X; 

但是,如果你(在鏈表等)需要一個字段與同類型,你必須提供一個名稱你的結構

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

希望這有助於:)

編輯: 基思·湯普森說,typdef旨在創建別名:)

相關問題