为什么这个指针 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
) 成为该类型的类型别名,而不是该类型的对象。您可以这样做来为任何类型创建类型别名,因此为指向结构的指针类型创建别名是完全有效的。
另一方面,虽然创建这样的类型别名并不少见,但它的风格很差。在大多数情况下,隐藏类型指针性质的 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[]);
我一直在查看各种 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
) 成为该类型的类型别名,而不是该类型的对象。您可以这样做来为任何类型创建类型别名,因此为指向结构的指针类型创建别名是完全有效的。
另一方面,虽然创建这样的类型别名并不少见,但它的风格很差。在大多数情况下,隐藏类型指针性质的 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[]);