Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C结构语法_C_Syntax - Fatal编程技术网

C结构语法

C结构语法,c,syntax,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_

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
定义结构(介于{}之间的部分)。该结构的类型为
\u UKWD\u USB\u DEVICE\u INFO
。关闭
}
UKWD\U USB\U设备\U信息

问题


之后的声明的目的是什么<代码>*PUKD\U USB\U设备信息和
*LPUKWD\U USB\U设备信息
。如果一个接触变量,而另一个在
*
和字母之间有空格,则表示不同的意思

是的,它是一个指针别名,然后您可以使用PUKWD\u USB\u DEVICE\u INFO作为UKWD\u USB\u DEVICE\u INFO*。大多数Windows结构都会这样做:


第三个别名中的L代表long(指针),除非我大错特错,否则它在32/64位代码中没有任何意义——它很可能是16位代码的残余,就像
WNDCLASS
定义一样。

C
typedef
声明是通过类比变量声明来理解的

int a, *b;
声明类型为
int
a
值和类型为
int*
b

typedef int A, *B;
声明类型
A
等效于
int
,类型
B
等效于
int*
。所以,只要想想如果这是一个变量声明,变量类型会是什么

是的,
PUKWD\u USB\u DEVICE\u INFO
相当于
struct\u UKWD\u USB\u DEVICE\u INFO*

编辑

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

这些是指针别名吗

如果一个接触变量,另一个在*和字母之间有空格,这意味着什么

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

我在网上看到的代码示例很少在花括号结束后使用一个以上的名称。对此有什么见解吗

通常,特别是在本例中,允许符号名可以表示不同的类型,但也可以不

您可以看到,在您的体系结构上,
p
“指针”和
LP
“长指针”恰好是相同的类型


在16位体系结构上,您将看到不同的标题,这些类型将不同。

这种定义风格在Windows平台上很常见。在16位分段体系结构的时代,每个结构定义typedef也有两个指针typedef,分别用于
(又称长指针):

NEAR
指针宽16位,
FAR
指针宽32位。大多数Windows API使用
FAR
指针,其原型使用指针typedef。顺便提一下,
LPVOID
是这样定义的:

typedef void FAR *LPVOID;
32位Windows于1995年问世,使其过时<出于兼容性原因,code>NEAR和
FAR
关键字保留了一段时间,定义为空

与16位Windows的兼容性早已变得毫无用处,但由于TypeDef仍在使用,这种用法仍然存在,但
FAR
NEAR
关键字已被删除


*
PUKWD\u USB\u DEVICE\u INFO
之间的空格被忽略,但我同意您的看法,将一个放在那里相当混乱。

为什么要使用多个别名?这是为了允许结构的大小可变吗?类型定义结构是一种非常糟糕的编程实践。它使代码混乱,导致误解,使代码更难理解,并使编译器名称空间混乱。可悲的是,微软还没有确定他们希望自己的代码简单明了。其结果是今天在它们的库和命名约定中看到的混乱。在发布的结构定义中,关键因素是“,”分隔符。“*”可以放在符号名之前的任何位置。@user3629249关于您的第一条评论:您为什么这么认为?我不认为每10个单词缺少
struct
会使代码混乱,恰恰相反。@szczurcio,我读过许多帖子,其中typedef名称与struct标记名称无关,或者使用相同的拼写(甚至大写)作为struct标记名和typedef'ing指针的优势,没有指示名称是指针。所有这些都是糟糕的编程实践。使用实际的“结构型标记名”格式(必要时使用“结构型标记名*”格式不会产生任何误解。您不能“声明定义”=)谢谢大家的帮助。你的指导很有教育意义,“C是一种空白语言”?那儿少了一个字吗?不,那是故意的。至少在90年代,人们(对我来说)经常看到“C是一种空白语言”或“C++是一种空白语言”之类的语句,然后解释源代码中的空白并不重要。也许我的记忆有误,或者这不是现代用法。
typedef void FAR *LPVOID;