不确定我是否理解这一行:"struct x {void (*y)(struct x *z);}"

Not sure I understand this line: "struct x {void (*y)(struct x *z);}"

我正在查看一个简单的 USB 驱动程序的代码,我遇到了一行我不太理解的代码:

struct UsbDevice
{
    ...
    void (*DeviceDetached)(struct UsbDevice *device) __attribute__((aligned(4)));
    ...
};

这里到底发生了什么?括号的这种用法(为...分配一个新名称给 *device?)和 "void" 的这种用法对我来说都是新的。 (自引用结构也很奇怪。)

这声明了一个名为 DeviceDetached 的函数指针,即 returns void 并接受一个指向 struct UsbDevice 的指针。 __attribute__((aligned(4))) 强制对齐四字节边界。你可以使用 C11 _Alignas.

有关 __attribute((aligned(4)) 的更多信息,请参阅 What is the meaning of "__attribute__((packed, aligned(4))) "

这在结构中声明了一个字段,它是一个函数指针。

void (*DeviceDetached)(struct UsbDevice *device)
^^^^  ^  ^^^^^^^^^^^^       ^^^^^^^
 |    |   field name        argument list
 |    |
 |    +- pointer type
 |
 +- return type

请注意 所有 括号是必需的 以将其指定为函数指针。更常见的是 typedef 函数指针类型,然后使用 typedef 的名称来声明结构字段或变量。

__attribute__ 部分是 GCC 对 C 的扩展,指示该字段应在 4 字节边界上对齐,而不管类型的 "natural" 对齐方式是什么。 C11 对此有一个标准化机制 (_Alignas),但编译器最近才开始支持它。