簡體   English   中英

Typedef結構聲明為兩種類型:“typedef struct x {..} X,* XPointer”

[英]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_GLContextvoid* )。
這不是這里的情況,我同意你的看法,它比幫助更令人困惑。

Linux內核編碼風格說要避免這些類型的def:

第5章:Typedef

請不要使用“vps_t”之類的東西。

將typedef用於結構和指針是錯誤的 當你看到一個

 vps_t a; 

在源頭,這是什么意思?

相反,如果它說

 struct virtual_container *a; 

你實際上可以告訴“a”是什么。

有些人喜歡在他們命名變量時使用匈牙利表示法的想法。 有些人在命名類型時會進一步采用這個概念。

我認為這是一個品味問題。

但是,我認為它模糊了事物(比如你的例子),因為你必須挖掘名稱聲明才能找到它的類型。 我更喜歡明顯和明確的東西,我會避免這種類型的名稱。

(請記住, typedef不會引入新類型,而只會引入一個新類型的新名稱。)

人們偶爾使用typedef指針的主要原因是將類型表示為程序員的“黑盒子對象”,並允許將來更容易地更改其實現。

例如,今天可能類型是指向結構的指針,但明天該類型將成為某些表的索引,某種類型的句柄/鍵或文件描述符。 Typedef這樣告訴程序員他們不應該嘗試他們通常對指針做的事情,比如將它與0 / NULL進行比較,解除引用它(例如 - 直接訪問成員),遞增它等等,作為它們的代碼將來可能會被打破。 當然,使用命名約定(例如您的朋友),會顯示並編碼底層實現實際上是指針與此目的沖突。

這樣做的另一個原因是不太可能出現這種錯誤:

myStructR *ptr1, ptr2;
myStructP  ptr3, ptr4;

這是非常弱的問題,因為編譯器通常會在以后捕獲您濫用ptr2 ,但這是執行此操作的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM