如何在记录结构中声明并集?

问题描述 投票:4回答:1

我正在尝试定义TWaveFormatExtensible类型,但是我不确定是否正确声明了Samples联合。这是头文件(Windows SDK 10.0.17763.0)中的原始声明:

typedef struct {
    WAVEFORMATEX    Format;
    union {
        WORD wValidBitsPerSample;       /* bits of precision  */
        WORD wSamplesPerBlock;          /* valid if wBitsPerSample==0 */
        WORD wReserved;                 /* If neither applies, set to zero. */
    } Samples;
    DWORD           dwChannelMask;      /* which channels are */
                                        /* present in stream  */
    GUID            SubFormat;
}

这是我尝试过的:

type
  TWAVEFORMATEX = record
    wFormatTag: Word;
    nChannels: LongWord;
    nSamplesPerSec: Word;
    nAvgBytesPerSec: LongWord;
    nBlockAlign: Word;
    wBitsPerSample: Word;
    cbSize: Word;
  end;

  TWaveFormatExtensible = record
    Format: TWAVEFORMATEX;
    dwChannelMask: LongWord;
    SubFormat: Integer;
    case Word of
      0: (wValidBitsPerSample: Word;);
      1: (wSamplesPerBlock: Word;);
      2: (wReserved: Word;);
  end;

但是那是不正确的。如何在Delphi的记录结构内声明并集?

delphi winapi delphi-7
1个回答
7
投票

结构的字段必须与原始(C ++)声明中的顺序相同。但是有一个问题:原始的声明将Samples变体放在记录的中间,而Delphi不允许这样做。

您可以通过将变体部分声明为单独的记录,然后将该记录作为最终结构中的字段包括在内来解决此问题。

TWaveFormatExtensibleSamples = record
case Word of
  0: (wValidBitsPerSample: Word;);
  1: (wSamplesPerBlock: Word;);
  2: (wReserved: Word;);
end;

然后构建最终结构:

TWaveFormatExtensible = record
  Format: TWAVEFORMATEX;
  Samples: TWaveFormatExtensibleSamples;
  dwChannelMask: DWORD;
  SubFormat: TGUID; 
end;

edit:具有不同部分的记录的文档,状态:

记录类型可以有一个变体部分,看起来像一个case语句。变体部分必须遵循记录声明中的其他字段。

这涉及没有附带记录声明的变体零件。

但是,正如Remy Lebeau所指出的,可以在TWaveFormatExtensible声明中直接声明带有变体部分的record作为结构的一部分,在其他字段之间:

TWaveFormatExtensible = record
  Format: TWAVEFORMATEX;
  Samples: record
    case Word of
    0: (wValidBitsPerSample: Word;);
    1: (wSamplesPerBlock: Word;);
    2: (wReserved: Word;);
  end;
  dwChannelMask: DWORD;
  SubFormat: TGUID;
end;

因此,可以与单独声明的TWaveFormatExtensibleSamples记录一起使用。

© www.soinside.com 2019 - 2024. All rights reserved.