1

我正在将LUFA用于一个项目,在阅读了一些示例后,我看到了其中一些构造。这些是宏吗?我知道 AVR 设备并且知道 PROGMEM 是其中之一?但是什么是 .Header 以及为什么它以“.”开头。

有人可以向我解释如何创建这样的结构或告诉我在 LUFA 文档中可以在哪里找到它们吗?

USB_Descriptor_Device_t PROGMEM DeviceDescriptor =

{
    .Header                 = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device},

    .USBSpecification       = VERSION_BCD(01.10),
    .Class                  = USB_CSCP_NoDeviceClass,
    .SubClass               = USB_CSCP_NoDeviceSubclass,
    .Protocol               = USB_CSCP_NoDeviceProtocol,

    .Endpoint0Size          = FIXED_CONTROL_ENDPOINT_SIZE,

    .VendorID               = 0x03EB,
    .ProductID              = 0x2045,
    .ReleaseNumber          = VERSION_BCD(00.01),

    .ManufacturerStrIndex   = 0x01,
    .ProductStrIndex        = 0x02,
    .SerialNumStrIndex      = USE_INTERNAL_SERIAL,

    .NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS

};
4

2 回答 2

2

这是命名结构成员的 C99 方式,因此您可以按任意顺序给出值。我相信这个术语是“指定的初始化程序”。不是 C++ 的一部分。

于 2011-02-19T18:00:50.173 回答
0

正如Bo Persson所说,这是初始化 struct 的 C99 方式。的 LUFA 文档USB_Descriptor_Device_t说该Header字段是USB_Descriptor_Header_t.

如果您要处理 C99 代码,您可能应该稍微阅读一下指定的初始化程序。您可以将您的代码段翻译成:

USB_Descriptor_Device_t PROGMEM DeviceDescriptor;
memset(&DeviceDescriptor, 0, sizeof(DeviceDescriptor));
DeviceDescriptor.Header.Size = sizeof(USB_Descriptor_Device_t);
DeviceDescriptor.Header.Type = DTYPE_Device;
DeviceDescriptor.USBSpecification = VERSION_BCD(01.10); /* beware of leading zeros! */
DeviceDescriptor.Class = USB_CSCP_NoDeviceClass;
DeviceDescriptor.SubClass = USB_CSCP_NoDeviceSubClass;
DeviceDescriptor.Protocol = USB_CSCP_NoDeviceProtocol;
/* etc etc etc */

我认为在这种情况下显式初始化更容易阅读,但指定的初始化器确实有它们的用途。

于 2011-02-19T18:19:02.933 回答