为什么这个指针 Typedef 指向一个结构

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 的任何用法,只是有点惊讶地看到一个指向结构的指针 typedef,是否了解为什么这样做?或者只是一些显示 *mach_port_name_array_t 的示例代码将不胜感激。

I [...] was just a little surprised to see a pointer typedef'd to a struct

我不会这样描述你提交的声明。考虑代码

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) 成为该类型的类型别名,而不是该类型的对象。您可以这样做来为任何类型创建类型别名,因此为指向结构的指针类型创建别名是完全有效的。

另一方面,虽然创建这样的类型别名并不少见,但它的风格很差。在大多数情况下,隐藏类型指针性质的 typedefs 产生的混乱多于清晰度。命名约定对此有所帮助,但不如完全避免此类 typedef。

此外,在这种特殊情况下,名称具有误导性。它表明该类型是数组类型,如果不是。但是,它是实际参数应为数组的函数参数的正确指针类型:

void do_something_with_ports(mach_port_name_array_t port_names);

// ...

mach_port_name_t ports[3];

// ...

do_something_with_ports(ports);

然而,正如我所说,使用 typedef 的指针类型是一种糟糕的风格。该函数最好这样声明:

void do_something_with_ports(mach_port_name_t *port_names);

或者,等价地,

void do_something_with_ports(mach_port_name_t port_names[]);