C结构语法

C structure syntax

C header 样本.

typedef LPVOID UKWD_USB_DEVICE;

typedef struct _UKWD_USB_DEVICE_INFO {
    DWORD dwCount;
    unsigned char Bus;
    unsigned char Address;
    unsigned long SessionId;
    USB_DEVICE_DESCRIPTOR Descriptor;
} UKWD_USB_DEVICE_INFO, *PUKWD_USB_DEVICE_INFO, * LPUKWD_USB_DEVICE_INFO;

我的理解

struct定义了一个结构体({}之间的部分)。结构的类型是 _UKWD_USB_DEVICE_INFO}收盘后UKWD_USB_DEVICE_INFOan alias to this structure

问题

之后声明的目的是什么。 * PUKD_USB_DEVICE_INFO*LPUKWD_USB_DEVICE_INFODo these pointer aliases 如果一个人接触变量而另一个人在 * 和字母之间有一个 space 意味着不同的东西?

是的,它是一个指针别名,然后您可以将 PUKWD_USB_DEVICE_INFO 用作 UKWD_USB_DEVICE_INFO*。大多数 Windows 结构都是这样做的:

第三个别名中的 L 代表长(指针),除非我弄错了,否则它在 32/64 位代码中没有任何意义 - 它可能是 16 位代码的遗留物,就是这种情况使用那个 WNDCLASS 定义。

C typedef声明类比变量声明。

int a, *b;

声明 int 类型的值 aint* 类型的 b

typedef int A, *B;

声明类型 A 等同于 int 和类型 B 等同于 int*。所以,想想如果这是一个变量声明,变量类型会是什么。

所以是的,PUKWD_USB_DEVICE_INFO 等同于 struct _UKWD_USB_DEVICE_INFO*

编辑

另外,space也无所谓。 C是白space语言。额外的别名不是必需的,它们只是为了适应各种项目和 API 的约定,这些项目和 API 喜欢通过包含 P 或其他子字符串的名称来调用指针类型。有时,随着时间的推移,这些项目最终会有多个约定,因此会有多个别名。当 API 更新或在不同平台之间出于兼容性原因也可能需要它们。

Are these pointer aliases?

是的。

Does it mean anything if one is touching the variable and the other has a space between the * and lettering?

没有。在 C 中,标记之间的空格对编译器没有意义。他们只是改变了查看代码的人的可读性。

I have seen very few code examples online use more than one name after the close of the curly brackets. Any insight on this?

通常,特别是在这种情况下,这样做是为了允许 可能 代表不同类型,但 可能不会 的符号名称.

您看到在您的体系结构中,P "pointer" 和 LP "long pointer" 恰好是同一类型。

在 16 位体系结构上,您会看到不同的 header,这些类型也会不同。

这种定义风格在 Windows 平台上很常见。在 16 位分段架构时代,每个结构定义类型定义也有 2 个指针类型定义 nearfar(又名长指针):

typedef LPVOID UKWD_USB_DEVICE;

typedef struct _UKWD_USB_DEVICE_INFO {
    DWORD dwCount;
    unsigned char Bus;
    unsigned char Address;
    unsigned long SessionId;
    USB_DEVICE_DESCRIPTOR Descriptor;
} UKWD_USB_DEVICE_INFO, NEAR * PUKWD_USB_DEVICE_INFO, FAR * LPUKWD_USB_DEVICE_INFO;

NEAR 指针为 16 位宽,FAR 指针为 32 位宽。大多数 Windows API 采用 FAR 指针,并且它们的原型使用指针 typedef。顺便说一下,LPVOID 是这样定义的:

typedef void FAR *LPVOID;

32 位 Windows 于 1995 年问世并使它过时。出于兼容性原因,NEARFAR 关键字保留了一段时间,定义为空。

与 16 位 Windows 的兼容性早已变得无用,但由于 typedef 仍在使用,因此使用仍然存在,但删除了 FARNEAR 关键字。

*PUKWD_USB_DEVICE_INFO 之间的 space 被忽略了,但我同意你的看法,把一个放在那里相当混乱。