什麼在C這兩個聲明之間的區別:`typedef struct X {}`和`typedef struct {} X`有什麼區別?
typedef struct square{
//Some fields
};
和
typedef struct{
//Some fields
} square;
什麼在C這兩個聲明之間的區別:`typedef struct X {}`和`typedef struct {} X`有什麼區別?
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
定義恰好合併爲一個聲明。
另外,在第一種情況下'typedef'是多餘的,什麼都不做。 – HolyBlackCat 2014-11-03 22:47:10
@HolyBlackCat:我完全錯過了。謝謝。 – 2014-11-03 22:53:52
謝謝!真的幫了! – PlayHardGoPro 2014-11-03 22:57:02
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旨在創建別名:)
我知道,我的結構中有一些字段,我只需要知道結構底部和頂部名稱的區別... – PlayHardGoPro 2014-11-03 22:42:33
[爲什麼我們應該在C中經常鍵入一個結構?] (http://stackoverflow.com/questions/252780/why-should-we-typedef-a-struct-so-often-in-c) – Raedwald 2016-10-17 15:48:01