Jump to content
Alexander Sviridenkov

Linux: wrong enum size

Recommended Posts

Looks like there is bug in 10.3 Linux compiler: maximum enum size is limited to 8 bytes. F.e.



 TMyEnum = (a1, a2, ..a100);

 TMyEnums = set of TMyEnum;

var X: TMyEnums;

sizeof(X) returns 8 on Linux platform.

Share this post

Link to post
program LargeEnumSet;


{$R *.res}


  TLargeEnum = (
    e000, e001, e002, e003, e004, e005, e006, e007, e008, e009, e010, e011, e012, e013, e014, e015, e016, e017, e018, e019,
    e020, e021, e022, e023, e024, e025, e026, e027, e028, e029, e030, e031, e032, e033, e034, e035, e036, e037, e038, e039,
    e040, e041, e042, e043, e044, e045, e046, e047, e048, e049, e050, e051, e052, e053, e054, e055, e056, e057, e058, e059,
    e060, e061, e062, e063, e064, e065, e066, e067, e068, e069, e070, e071, e072, e073, e074, e075, e076, e077, e078, e079,
    e080, e081, e082, e083, e084, e085, e086, e087, e088, e089, e090, e091, e092, e093, e094, e095, e096, e097, e098, e099,
    e100, e101, e102, e103, e104, e105, e106, e107, e108, e109, e110, e111, e112, e113, e114, e115, e116, e117, e118, e119,
    e120, e121, e122, e123, e124, e125, e126, e127, e128, e129, e130, e131, e132, e133, e134, e135, e136, e137, e138, e139,
    e140, e141, e142, e143, e144, e145, e146, e147, e148, e149, e150, e151, e152, e153, e154, e155, e156, e157, e158, e159,
    e160, e161, e162, e163, e164, e165, e166, e167, e168, e169, e170, e171, e172, e173, e174, e175, e176, e177, e178, e179,
    e180, e181, e182, e183, e184, e185, e186, e187, e188, e189, e190, e191, e192, e193, e194, e195, e196, e197, e198, e199
    TLargeEnumSet = Set of TLargeEnum;

procedure TestLargeEnum;
  LargeEnumSet: TLargeEnumSet;
  Enum: TLargeEnum;
  LargeEnumSet := [e011, e031, e051, e071, e091, e111, e131, e151, e171, e191];
  Writeln('SizeOf = ', SizeOf(LargeEnumSet));
  for Enum in LargeEnumSet
  do Write(Ord(Enum),' ');

      on E: Exception do
        Writeln(E.ClassName, ': ', E.Message);
    Write('Press Enter: ');

output on Win32 and Win64


SizeOf = 25
11 31 51 71 91 111 131 151 171 191
Press Enter:



What is the output on Linux?

Share this post

Link to post

Unfortunately, the debugger often shows incorrect values

Share this post

Link to post

Changing "this setup" have some relevance for your case?

  • Double Word = LongInt (if I dont wrong) - non-signed = SizeOf = 4bytes = 2^32-1 ... 0 to 4,294,967,295 = Cardinal
  • using "Minimum enum size = Double Word", the "type" have 4bytes of size - not a "var" !!!
    • as necessary "re-build" the .DCU to recreate new compiled code!



  image.thumb.png.465eecc0dc64aa15fb766bba0e26b2dc.png  image.thumb.png.b195cf86857316fc9d9cc06f1bb5305b.png


Edited by Guest

Share this post

Link to post
14 minutes ago, Alexander Sviridenkov said:

How mininum enume size may affect this case? This test enum is larger than maximum setting for "Minimum enum size" parameter.

did you test it in your Linux 64? have a relevance in your resulted?



maybe "minimun" would stay better if "maximun" but... is a Embarcadero domain!


Edited by Guest

Share this post

Link to post

for "specific point", yes. for all project, better on .dproj

Share this post

Link to post

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now