C结构语法

时间:2015-05-16 16:18:53

标签: c syntax

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_INFOan alias to this structure

问题

之后声明的目的是什么? * PUKD_USB_DEVICE_INFO*LPUKWD_USB_DEVICE_INFO。如果有人触摸变量而另一个在*和刻字之间有空格,则Do these pointer aliases表示不同的内容?

4 个答案:

答案 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结构都这样做:

enter image description here

第三个别名中的L代表长(指针),除非我错了,它在32/64位代码中没有意义 - 它可能是16位内容的剩余部分,就像那样WNDCLASS定义。

答案 2 :(得分:1)

  

这些指针别名吗?

  

如果一个人触摸变量而另一个人在*和刻字之间有空格,这意味着什么?

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

  

我看到很少有代码示例在大括号结束后在线使用多个名称。对此有何见解?

通常情况下,特别是在这种情况下,我们已完成允许可能代表不同类型的符号名称,但可能不会

您在您的体系结构上看到了P"指针"和一个LP"长指针"碰巧是同一种类型。

在16位架构上,您将看到不同的标头,这些类型会有所不同。

答案 3 :(得分:1)

这种定义在Windows平台上很常见。在16位分段体系结构的时代,每个结构定义typedef还有nearfar(又称长指针)的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年问世,并且已经过时了。由于兼容性原因,NEARFAR个关键字保留了一段时间,定义为空。

与16位Windows的兼容性长期以来一直无用,但由于typedef仍在使用,但仍然存在使用情况,但FARNEAR关键字已被删除。

*PUKWD_USB_DEVICE_INFO之间的空格被忽略,但我同意你的意见,将其放在那里相当混乱。