为什么这个指针Typedef为结构

时间:2018-05-28 02:59:49

标签: c darwin mach xnu

我一直在查看各种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的示例代码将非常感激。

1 个答案:

答案 0 :(得分:3)

  

我看到对结构

的指针类型设置有点惊讶

这不是我如何描述你提出的声明。考虑代码

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);

正如我所说,使用typedef'd指针类型的风格很差。这个函数会更好地声明:

void do_something_with_ports(mach_port_name_t *port_names);

或等同地

void do_something_with_ports(mach_port_name_t port_names[]);