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