[英]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.