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_INFO
是an alias to this structure。
问题
之后声明的目的是什么。 * PUKD_USB_DEVICE_INFO
和 *LPUKWD_USB_DEVICE_INFO
。 Do these pointer aliases 如果一个人接触变量而另一个人在 *
和字母之间有一个 space 意味着不同的东西?
是的,它是一个指针别名,然后您可以将 PUKWD_USB_DEVICE_INFO 用作 UKWD_USB_DEVICE_INFO*。大多数 Windows 结构都是这样做的:
第三个别名中的 L 代表长(指针),除非我弄错了,否则它在 32/64 位代码中没有任何意义 - 它可能是 16 位代码的遗留物,就是这种情况使用那个 WNDCLASS
定义。
C typedef
声明类比变量声明。
int a, *b;
声明 int
类型的值 a
和 int*
类型的 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 个指针类型定义 near
和 far
(又名长指针):
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 年问世并使它过时。出于兼容性原因,NEAR
和 FAR
关键字保留了一段时间,定义为空。
与 16 位 Windows 的兼容性早已变得无用,但由于 typedef 仍在使用,因此使用仍然存在,但删除了 FAR
和 NEAR
关键字。
*
和 PUKWD_USB_DEVICE_INFO
之间的 space 被忽略了,但我同意你的看法,把一个放在那里相当混乱。
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_INFO
是an alias to this structure。
问题
之后声明的目的是什么。 * PUKD_USB_DEVICE_INFO
和 *LPUKWD_USB_DEVICE_INFO
。 Do these pointer aliases 如果一个人接触变量而另一个人在 *
和字母之间有一个 space 意味着不同的东西?
是的,它是一个指针别名,然后您可以将 PUKWD_USB_DEVICE_INFO 用作 UKWD_USB_DEVICE_INFO*。大多数 Windows 结构都是这样做的:
第三个别名中的 L 代表长(指针),除非我弄错了,否则它在 32/64 位代码中没有任何意义 - 它可能是 16 位代码的遗留物,就是这种情况使用那个 WNDCLASS
定义。
C typedef
声明类比变量声明。
int a, *b;
声明 int
类型的值 a
和 int*
类型的 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 个指针类型定义 near
和 far
(又名长指针):
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 年问世并使它过时。出于兼容性原因,NEAR
和 FAR
关键字保留了一段时间,定义为空。
与 16 位 Windows 的兼容性早已变得无用,但由于 typedef 仍在使用,因此使用仍然存在,但删除了 FAR
和 NEAR
关键字。
*
和 PUKWD_USB_DEVICE_INFO
之间的 space 被忽略了,但我同意你的看法,把一个放在那里相当混乱。