什么是 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 特定的扩展。它也被其他一些编译器复制,但绝不是可移植代码。
这是代码的一部分。我不明白
是什么意思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 特定的扩展。它也被其他一些编译器复制,但绝不是可移植代码。