[英]What's the difference between `typedef struct X { }` and `typedef struct { } X`?
[英]Typedef struct declared as two types: “typedef struct x { .. } X, *XPointer”
對不起,如果之前有人詢問,我甚至不確定要搜索什么來提出這個問題。
當我創建一個typedef struct
,我通常做這樣的事情:
typedef struct myStruct {
int a;
int b;
struct myStruct *next;
} MyStruct;
所以我最后用MyStruct
聲明它。 然后,當我創建將其作為參數傳遞的函數時,我寫道
int doSomething(MyStruct *ptr){
}
然而,我對一個項目的朋友合作,我所遇到他的編碼風格,這也宣告*MyStructP
是這樣的:
typedef struct myStruct {
int a;
int b;
struct myStruct *next;
} MyStructR, *MyStructP;
然后他在他的函數中使用MyStructP
,所以他的參數看起來像:
int doSomething(MyStructP)
所以他不必在參數列表中使用*
。 這讓我很困惑,因為當我查看參數列表時,我總是尋找*
以確定arg是否是指針。 最重要的是,我正在創建一個函數,它接受我創建的結構和他創建的結構,所以我的arg有*而他的沒有。 超級混亂!!
有人可以就兩者之間的差異提供見解/比較/建議嗎? 優點? 缺點? 哪種方式更好或更差,還是更廣泛使用? 任何信息都可以。 謝謝!
通常認為在typedef后面隱藏指針的風格很差,除非它們是不透明的句柄(例如SDL_GLContext
是void*
)。
這不是這里的情況,我同意你的看法,它比幫助更令人困惑。
Linux內核編碼風格說要避免這些類型的def:
第5章:Typedef
請不要使用“vps_t”之類的東西。
將typedef用於結構和指針是錯誤的 。 當你看到一個
vps_t a;
在源頭,這是什么意思?
相反,如果它說
struct virtual_container *a;
你實際上可以告訴“a”是什么。
人們偶爾使用typedef指針的主要原因是將類型表示為程序員的“黑盒子對象”,並允許將來更容易地更改其實現。
例如,今天可能類型是指向結構的指針,但明天該類型將成為某些表的索引,某種類型的句柄/鍵或文件描述符。 Typedef這樣告訴程序員他們不應該嘗試他們通常對指針做的事情,比如將它與0 / NULL進行比較,解除引用它(例如 - 直接訪問成員),遞增它等等,作為它們的代碼將來可能會被打破。 當然,使用命名約定(例如您的朋友),會顯示並編碼底層實現實際上是指針與此目的沖突。
這樣做的另一個原因是不太可能出現這種錯誤:
myStructR *ptr1, ptr2;
myStructP ptr3, ptr4;
這是非常弱的問題,因為編譯器通常會在以后捕獲您濫用ptr2
,但這是執行此操作的原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.