簡體   English   中英

為什么這個TypeType指針指向一個結構體

[英]why is this pointer Typedef'd to a struct

我一直在瀏覽各種IPC系統的代碼,碰巧在Mach(xnu-123.5 / osfmk / ipc / ipc_port.h)中遇到了這些問題。

typedef port_name_t          mach_port_name_t;
typedef mach_port_name_t    *mach_port_name_array_t;

其中port_name_t的定義是一個結構。

我還沒有遇到過*mach_port_name_array_t任何用法,看到一個類型為結構體的指針類型感到有點驚訝,對為什么這樣做有任何見解? 或者只是一些示例代碼顯示*mach_port_name_array_t的實際效果,將不勝感激。

我[...]有點驚訝地看到一個類型為結構體的指針

那不是我要描述您提出的聲明的方式。 考慮代碼

 typedef mach_port_name_t *mach_port_name_array_t; 

如果沒有typedef關鍵字,則它將聲明mach_port_name_array_t作為指向類型為mach_port_name_t的對象的指針,該對象恰好是結構類型。 結構的指針在C中完全是例程,因為C具有內置的運算符( -> ),用於通過指針訪問結構成員。

添加typedef只會使聲明的標識符( mach_port_name_array_t )成為該類型的類型別名,而不是該類型的對象。 您可以執行此操作以為任何類型創建類型別名,因此為指向結構的指針類型創建別名是完全有效的。

另一方面,盡管創建這種類型別名的情況並不少見,但風格很差。 在大多數情況下,隱藏類型指針性質的typedef造成的混亂比清楚還多。 命名約定可以幫助您解決問題,但不能完全避免此類typedef。

此外,在這種特殊情況下,該名稱具有誤導性。 它暗示該類型是數組類型,而不是數組類型。 但是,對於實際參數預期為數組的函數參數,它是正確的指針類型:

void do_something_with_ports(mach_port_name_array_t port_names);

// ...

mach_port_name_t ports[3];

// ...

do_something_with_ports(ports);

但是,正如我所說,使用類型定義的指針類型是較差的樣式。 最好像下面這樣聲明該函數:

void do_something_with_ports(mach_port_name_t *port_names);

或者,等效地,

void do_something_with_ports(mach_port_name_t port_names[]);

暫無
暫無

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

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