【问题标题】:why is this pointer Typedef'd to a struct为什么这个指针 Typedef'd 指向一个结构
【发布时间】:2018-05-28 02:59:49
【问题描述】:

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

【问题讨论】:

  • 仅供参考,您应该将其解读为“mach_port_name_array_t 是指向mach_port_name_t 的指针的别名”。将其视为typedef mach_port_name_t* mach_port_name_array_t; 可能会有所帮助(注意* 的位置)

标签: c darwin mach xnu


【解决方案1】:

我 [...] 只是有点惊讶地看到一个指针 typedef'd 指向一个结构

我不会这样描述你提出的声明。考虑代码

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)成为该类型的类型别名,而不是该类型的对象。您可以这样做来为任何类型创建类型别名,因此为指向结构的类型创建别名是完全有效的。

另一方面,虽然创建这样的类型别名并不少见,但它的风格很差。在大多数情况下,隐藏类型指针性质的typedefs 会产生更多的混乱而不是清晰。命名约定可以对此有所帮助,但不如完全避免此类 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[]);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-25
    • 2017-07-13
    • 1970-01-01
    • 2018-07-28
    相关资源
    最近更新 更多