[英]Typedef struct wrong declaration?
我參考了下面的教程,后來意識到使用typedef聲明結構是錯誤的方法。
typedef struct
{
char name[namesize];
char address[addresssize];
int YearOfBirth;
int MonthOfBirth;
int DayOfBirth;
} PersonalData;
然后聲明:
PersonalData x;
但是,我相信正確的方法是
typedef struct personaldataStruct
{
char name[namesize];
char address[addresssize];
int YearOfBirth;
int MonthOfBirth;
int DayOfBirth;
} PersonalData;
然后聲明:
PersonalData x;
作者誤導了我嗎? 還是兩種方法都正確? 請確認。 這是教程http://www.iu.hio.no/~mark/CTutorial/CTutorial.html
兩種方法都沒有正式的“不正確”之處。
前者聲明一個無標簽的結構類型,並為該結構類型聲明typedef名稱PersonalData
。 后者聲明了一個結構類型struct personaldataStruct
和該結構類型的同義typedef名稱PersonalData
。 聲明的personaldataStruct
部分通常稱為“結構標簽”。
只要您使用PersonalData
typedef名稱來引用該結構類型,如
PersonalData x;
您將不會看到兩個聲明之間的任何區別。 在兩種情況下, x
都將聲明為相同。
后一種方法為您提供了另一種引用相同結構類型的方法struct personaldataStruct
如果出於某些原因您希望這樣做。 例如,使用后一個聲明時,您還可以將x
聲明為
struct personaldataStruct x;
完全等同於PersonalData x;
宣言。
就我個人而言,我更喜歡將這種方法與struct標簽一起使用,因為它為我提供了另一種引用類型的方式,這種方式在某些情況下可能會派上用場(例如,當struct類型必須引用自身時)。 但是在大多數非自我引用的情況下,使用前一種方法將是完美的。
兩者都是正確的。 第一種形式(不帶標簽)唯一真正的問題是,由於typedef名稱直到定義末尾才可見,因此無法從其自身的定義中引用該結構。 這是一個普遍的要求; 例如,鏈表,樹或其他類似圖的數據結構中的節點通常需要指向相同類型的其他對象。
由於struct標記和typedef名稱位於不同的命名空間中 (不要與C ++命名空間混淆),因此無需將它們區分。 對兩個都使用相同的標識符是完全可以接受的:
typedef struct PersonalData {
/* ... */
struct PersonalData *next;
} PersonalData;
或者,只要您將同時擁有標簽和typedef,就可以向前聲明typedef:
typedef struct PersonalData PersonalData;
/* At this point, "struct PersonalData is an incomplete type. */
struct PersonalData {
/* ... */
PersonalData *next;
};
/* And now "struct PersonalData" is a complete type. */
(但是,拼寫錯誤可能會給您留下一個typedef
,它仍然引用從未完成的不完整類型,這會觸發可能難以跟蹤的錯誤。復制粘貼是您的朋友。)
還有另一種選擇。 您定義的類型已經有一個名稱: struct PersonalData
。 typedef
所做的只是為同一類型賦予不同的名稱。 能夠將單個標識符用作類型名稱是很好的做法,但實際上不是必需的。 我自己的偏好是完全省略typedef
,僅將類型稱為struct PersonalData
:
struct PersonalData {
/* ... */
struct PersonalData *next;
};
struct PersonalData *head;
struct PersonalData fred;
除非將PersonalData
為不透明類型(意味着使用它的代碼不需要知道它是結構),否則顯式會有一些優勢。
在這一點上,很多人強烈不同意我的觀點,並且真的很喜歡對結構使用typedef,就像您可能會在評論中看到的那樣。 像這樣使用typedef並沒有錯。 只是沒有必要。 您應該准備好閱讀使用其他任何一種風格編寫的代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.