C标头示例。
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表示不同的内容?
答案 0 :(得分:5)
C typedef
声明通过类比变量声明来理解。
int a, *b;
声明类型为a
的{{1}}和int
类型的值b
。
int*
声明类似于typedef int A, *B;
的{{1}}类型和等同于A
的类型int
。所以,如果这是一个变量声明,只需考虑变量类型。
是的,B
等同于int*
。
修改强>
此外,空间无关紧要。 C是一种空白语言。额外的别名不是必需的,它们只是适合各种项目和API的约定,它们喜欢通过包含PUKWD_USB_DEVICE_INFO
或其他子串的名称来调用指针类型。有时这些项目会随着时间的推移而出现多个约定,因此有多个别名。当API更新时,或者在不同平台之间,出于兼容性原因,也可能需要它们。
答案 1 :(得分:1)
是的,它是指针别名,然后您可以使用PUKWD_USB_DEVICE_INFO作为UKWD_USB_DEVICE_INFO *。大多数Windows结构都这样做:
第三个别名中的L代表长(指针),除非我错了,它在32/64位代码中没有意义 - 它可能是16位内容的剩余部分,就像那样WNDCLASS
定义。
答案 2 :(得分:1)
这些指针别名吗?
是
如果一个人触摸变量而另一个人在*和刻字之间有空格,这意味着什么?
没有。在C中,令牌之间的空格对编译器没有意义。它们只是改变了查看代码的人的可读性。
我看到很少有代码示例在大括号结束后在线使用多个名称。对此有何见解?
通常情况下,特别是在这种情况下,我们已完成允许可能代表不同类型的符号名称,但可能不会。
您在您的体系结构上看到了P
"指针"和一个LP
"长指针"碰巧是同一种类型。
在16位架构上,您将看到不同的标头,这些类型会有所不同。
答案 3 :(得分:1)
这种定义在Windows平台上很常见。在16位分段体系结构的时代,每个结构定义typedef还有near
和far
(又称长指针)的2个指针typedef:
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
之间的空格被忽略,但我同意你的意见,将其放在那里相当混乱。