最小枚举大小在 Delphi 中不起作用

Minimum enum size not working in Delphi

为了与 C/C++ 结构进行交互,我必须将 Delphi 记录中的最小枚举大小设置为 4。但是,我无法使其正常工作。

type
  TFooEnum = (e1, e2, e3);

  {$Z4}
  TFoo = record
  public
    f: TFooEnum;
    b: byte;
  end;
  {$Z1}

  writeln(SizeOf(TFoo)); -> output is 2 instead of 8

我也尝试过 {$Z+}{$MINENUMSIZE 4} 它只有在我为整个项目的编译器选项中设置它时才有效,但这会扰乱其他记录内存布局,其中枚举必须为 1 字节大小。

大小是枚举类型本身的 属性。所以你必须像这样声明你的枚举类型:

type
  {$Z4}
  TFooEnum = (e1, e2, e3);
  {$Z1}

对此的思考方式是,对齐记录的记录布局完全由记录成员的大小和对齐属性决定。 $MINENUMSIZE 指令仅通过影响任何枚举类型成员的大小和对齐属性来间接影响布局。