![](/img/trans.png)
[英]What is 'forward declaration' and the difference between 'typedef struct X' and '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.