首页 > 解决方案 > 为什么这个指针 Typedef'd 指向一个结构

问题描述

我一直在查看各种 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将不胜感激。

标签: cdarwinmachxnu

解决方案


我 [...] 只是有点惊讶地看到一个指针 typedef'd 指向一个结构

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

typedef mach_port_name_t    *mach_port_name_array_t;

如果typedef关键字不存在,那么它将声明mach_port_name_array_t为指向 type 对象的指针,该对象mach_port_name_t恰好是结构类型。指向结构的指针在 C 中完全是例行公事,以至于 C 有一个内置的运算符 ( ->) 用于通过指针访问结构成员。

添加typedef只是使声明的标识符 ( mach_port_name_array_t) 成为该类型的类型别名,而不是该类型的对象。您可以这样做来为任何类型创建类型别名,因此为指向结构的指针类型创建别名是完全有效的。

另一方面,虽然创建这样的类型别名并不少见,但它的风格很差。在大多数情况下,typedef隐藏类型指针性质的 s 产生的混乱多于清晰。命名约定可以对此有所帮助,但不如完全避免此类 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[]);

推荐阅读