Дескриптор устройства в lufa ... Что это за структура (внутри)?Я думаю, что в этом нет ничего конкретного, а только вопрос к программистам C / C ++ - PullRequest
1 голос
/ 19 февраля 2011

Я использую 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

};

Ответы [ 2 ]

2 голосов
/ 19 февраля 2011

Это C99 способ именования членов структуры, поэтому вы можете задавать значения в произвольном порядке.Я считаю, что термин «назначенные инициализаторы».Не является частью C ++.

0 голосов
/ 19 февраля 2011

Как сказал Бо Перссон , это способ 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 */

Я думаю, что в этом случае явную инициализацию легче читать, но назначенные инициализаторы имеют свое применение.

...