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

最小枚举大小在Delphi中不起作用,delphi,enums,Delphi,Enums,为了与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}只有在

为了与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
指令通过对任何枚举类型成员的大小和对齐属性的影响,仅间接影响layour。

文档中只需再多三行,我就不必问愚蠢的问题了。谢谢我想这可能是作为一个文档作者很难预料的事情之一。如果您已经有了记录布局的正确心智模型,那么您可能不会想到有人会认为
$MINENUMSIZE
会直接影响记录布局。文档会说,如果类型是在{$Z1}状态下声明的(默认)。如果枚举类型的值超过256个,或者该类型是在{$Z2}状态下声明的,则它将存储为无符号字。最后这里的关键是在{$ZX}状态中声明的短语。当我需要精确布局时,我使用打包记录。但无论是否打包,我都无法让它工作,因此我没有回答这个问题。我正在阅读文档,但这些词在我脑海中的含义完全不同:)打包记录通常是实现特定布局的错误方式。您最终要做的是将记录的对齐度设置为1,从而将所有成员的对齐度设置为>1。如果packed关键字不存在,人们就不会像以前那样(错误地)使用它。我是从一个人的痛苦经历中说起的,他必须维护一个充满打包记录的库,这些记录需要打包以实现二进制兼容性。当我知道的比现在少时,我犯了最初的错误。