枚举类型:限制项目数量?

时间:2010-11-04 13:39:07

标签: delphi

Delphi中对枚举类型中的项目数有限制吗?我需要创建一个可能有几百个项目的枚举类型,并且要确保例如255个项目没有限制。

type 
  TMyType = (mtOne, mtTwo, mtThree, ..., mtThreeHundred);

4 个答案:

答案 0 :(得分:6)

我相信理论上的限制是2 ^ 32项;但实际上,RTTI生成通常是限制,因为RTTI不能超过65535字节来存储所有内容,包括枚举元素的名称;名称以UTF-8存储,所以它不是太糟糕。

另一方面,具有元素显式值的枚举没有完整的RTTI,因此您可以通过这种方式规避限制。这是一个程序,它创建一个包含500,001个枚举元素的源文件,它本身编译:

var
  i: Integer;
begin
  Writeln('type');
  Writeln('  E = (');
  for i := 1 to 500000 do
    Writeln('  x_', i, ' = ', i, ',');
  Writeln('x_last);');
  Writeln('begin');
  Writeln('end.');
end.

该程序的输出需要一些时间来使用dcc32进行编译,因为Delphi编译器使用只有32个桶的哈希表来检查枚举标识符重复项,以及一个只有256个桶用于文件级范围的哈希表,在没有{$SCOPEDENUMS ON}的情况下,是添加枚举标识符的地方。

答案 1 :(得分:5)

我在德语德尔福书中发现最多65535项。

在对文件进行一些挖掘之后,我找到了相应的部分:

Enumerated Types

  

枚举类型存储为   如果枚举有,则为无符号字节   不超过256个值和类型   在{$Z1}州宣布成立   默认)。如果枚举类型有   超过256个值,或者如果是类型   在{$Z2}状态声明了它   存储为无符号字。如果   枚举类型在。中声明   {$Z4}状态,它存储为   无符号双字。

所以实际上最多应该有4294967295($FFFFFFFF)项。

答案 2 :(得分:1)

试试看?只需几分钟就可以编写一个循环来构建你的类型语句,只要你愿意。使用消息框输出(可以使用ctrl + c复制到剪贴板),粘贴回Delphi,然后就可以了。

答案 3 :(得分:0)

是的Delphi中的枚举可以有超过256个项目。你不会遇到问题,但是如果要使用集合类型,你应该注意集合最多可以有256个元素。