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