不确定我是否理解这一行:"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
),但编译器最近才开始支持它。
我正在查看一个简单的 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
),但编译器最近才开始支持它。