1

私はプロジェクトにLUFAを使用しており、いくつかの例を読んだ後、これらの構成要素のいくつかを見ました。これらのマクロはありますか?私はAVRデバイスを知っていて、PROGMEMが1つであることを知っていますか?しかし、.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 に答える