Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.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
什么是枚举描述符类型描述符类型:8;用C代码是什么意思?_C_Struct_Enumeration_Bit Fields - Fatal编程技术网

什么是枚举描述符类型描述符类型:8;用C代码是什么意思?

什么是枚举描述符类型描述符类型:8;用C代码是什么意思?,c,struct,enumeration,bit-fields,C,Struct,Enumeration,Bit Fields,这是代码的一部分。我不明白你在说什么 enum DescriptorType DescriptorType :8; 什么意思 还有,什么是属性;你是说这里 enum DeviceClass { DeviceClassInInterface = 0x00, DeviceClassCommunications = 0x2, DeviceClassHub = 0x9, DeviceClassDiagnostic = 0xdc, DeviceClassMiscellaneous = 0xef

这是代码的一部分。我不明白你在说什么

enum DescriptorType DescriptorType :8;
什么意思

还有,什么是属性;你是说这里

enum DeviceClass {
 DeviceClassInInterface = 0x00,
 DeviceClassCommunications = 0x2,
 DeviceClassHub = 0x9,
 DeviceClassDiagnostic = 0xdc,
 DeviceClassMiscellaneous = 0xef,
 DeviceClassVendorSpecific = 0xff,
 };
struct UsbDeviceDescriptor {
    u8 DescriptorLength; // +0x0                                                                                                                                           
    enum DescriptorType DescriptorType : 8; // +0x1                                                                                                                        
    u16 UsbVersion; // (in BCD 0x210 = USB2.10) +0x2                                                                                                                       
    enum DeviceClass Class : 8; // +0x4                                                                                                                                    
    u8 SubClass; // +0x5                                                                                                                                                   
    u8 Protocol; // +0x6                                                                                                                                                   
    u8 MaxPacketSize0; // +0x7                                                                                                                                             
    u16 VendorId; // +0x8                                                                                                                                                  
    u16 ProductId; // +0xa                                                                                                                                                 
    u16 Version; // +0xc                                                                                                                                                   
    u8 Manufacturer; // +0xe                                                                                                                                               
    u8 Product; // +0xf                                                                                                                                                    
    u8 SerialNumber; // +0x10                                                                                                                                              
    u8 ConfigurationCount; // +0x11                                                                                                                                        
 } __attribute__ ((__packed__));
这是一个8位的位字段。这表示结构中包含枚举的8位

C中的枚举变量具有C99标准中的实现定义的大小Ref 6.2.2.2。如果不将其作为位字段包含,则可以使用8个以上的位来存储此值

} __attribute__ ((__packed__));
这表明编译器不应在结构元素之间添加任何填充字节。通常,在不同的结构元素之间添加填充字节,以允许32位或16位类型的更容易对齐的访问

您可以使用和不使用_属性__ __包装__)对struct UsbDeviceDescriptor进行sizeof,并可以看到差异


这是一个特定于GCC的扩展。它也被其他一些编译器复制,但决不是可移植代码。

此外,属性打包了什么;你是说这里?为什么它使用attrubute\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu?结构UsbInterfaceDescriptor{InterfaceClassVendorSpecific=0xff,}类:8;//+x05 u8亚类;u8协议;u8 StringIndex;}属性压缩;请使用问题下方的编辑链接进行编辑。记住,每个问题一个问题。至于你的问题,我建议你退一步,买几本初学者的书,开始阅读关于结构和位域的书。_属性______;打包___;用于防止编译器在结构中插入无意义的位来指示对齐。这是非标准的胡言乱语。很可能它不会实现程序员的意图。该属性表示gcc,但gcc不会跨不同类型填充位。最好的办法是重写整个代码。在运行时也切换到stdint.h。枚举位字段也是特定于编译器的。该标准只要求int、unsigned int和_Bool在位域中工作。谢谢Raje!那么,这是否意味着设备上的每个项目都是8位?DeviceClassCommunications=0x2,是否将其另存为DeviceClassCommunications=0x02?DeviceClass{DeviceClassInInterface=0x00,DeviceClassCommunications=0x2,DeviceClassHub=0x9,DeviceClassDiagnostic=0xdc,DeviceClassMiscellaneous=0xef,DeviceClassVendorSpecific=0xff,};C中的枚举与整数类型相同。枚举变量的大小由实现定义。不要与始终为int的枚举常量混淆。@brianley-还有一些16位值。e、 g.ProductId供应商ID
} __attribute__ ((__packed__));