什么是 enum DescriptorType DescriptorType :8;在C代码中是什么意思?

what does enum DescriptorType DescriptorType :8; mean in C code?

这是代码的一部分。我不明白

是什么意思
enum DescriptorType DescriptorType :8;

是什么意思?

这里的__attribute__ ((__packed__));是什么意思?

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__));
enum DescriptorType DescriptorType : 8; 

这是一个 8 位的 位域。这表明结构中包含枚举的 8 位。

C 中的 enum 变量具有实现定义的大小(C99 标准中的参考 6.2.2.2)。如果不将其作为位域包含,则可以使用多于 8 位来存储该值。

} __attribute__ ((__packed__));

这表明编译器不应在结构元素之间添加任何 填充字节。通常,在不同的结构元素之间添加填充字节,以允许更轻松地对齐访问 32 位或 16 位类型。

你可以做一个 sizeof (struct UsbDeviceDescriptor) 有和没有 __attribute__ ((__packed__)) 并且可以看到区别。

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