Delphi中对枚举类型中的项目数有限制吗?我需要创建一个可能有几百个项目的枚举类型,并且要确保例如255个项目没有限制。
type
TMyType = (mtOne, mtTwo, mtThree, ..., mtThreeHundred);
答案 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项。
在对文件进行一些挖掘之后,我找到了相应的部分:
枚举类型存储为 如果枚举有,则为无符号字节 不超过256个值和类型 在
{$Z1}
州宣布成立 默认)。如果枚举类型有 超过256个值,或者如果是类型 在{$Z2}
状态声明了它 存储为无符号字。如果 枚举类型在。中声明{$Z4}
状态,它存储为 无符号双字。
所以实际上最多应该有4294967295($FFFFFFFF
)项。
答案 2 :(得分:1)
试试看?只需几分钟就可以编写一个循环来构建你的类型语句,只要你愿意。使用消息框输出(可以使用ctrl + c复制到剪贴板),粘贴回Delphi,然后就可以了。
答案 3 :(得分:0)
是的Delphi中的枚举可以有超过256个项目。你不会遇到问题,但是如果要使用集合类型,你应该注意集合最多可以有256个元素。