c - 为什么这个指针 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
将不胜感激。
解决方案
我 [...] 只是有点惊讶地看到一个指针 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[]);
推荐阅读
- pytorch - Open3D-ML 和 pytorch
- regex - 在 hive 上第 n 次出现分隔符之前获取所有内容
- reactjs - react-window 元素类型无效:期望字符串(用于内置组件)或类/函数(用于复合组件)但得到:对象
- kotlin - 在 kotlin 中创建 gradle 插件时如何解决 kotlin 库中的冲突
- c++ - 在 C++ 中除以变量与除以 const 时性能下降
- python - 如何直接在 GPU 上或在另一个张量的设备上创建张量?
- c++ - 具有虚函数的静态多态性
- manim - Manim v0.2.0 self.play() 方法
- javascript - 在 Redux 中调度操作时组件不会重新渲染
- javascript - 在 HTML 文本中添加 SVG 文本并使它们看起来相同