我试图在案例交换机中包含UTF-8标识符,但是我收到此错误:
错误:有399个案例,案件范围超过256个案件
D代码:
switch(value)
{
case 'a': .. case 'z':
case 'A': .. case 'Z':
case 0xC0: .. case 0x24F:
Run Code Online (Sandbox Code Playgroud)
为什么编译器会施加这样的限制?为了达到最佳目的?我能克服它吗?
这样做可以获得更多空间.
您在此处看到的限制不在规范http://dlang.org/statement中,并且仅适用于编译器中的CaseRangeStatements:我在版本中的src/dmd/statement.c第3437行:
if (lval - fval > 256)
{ error("had %llu cases which is more than 256 cases in case range", lval - fval);
lval = fval + 256;
}
Run Code Online (Sandbox Code Playgroud)
因此,修复方法是将该范围分成几个部分并将它们放在彼此旁边:
switch(value)
{
case 'a': .. case 'z':
case 'A': .. case 'Z':
case 0xC0: .. case 0x14F: // this compiles
case 0x150: .. case 0x24F: // since it is broken up
Run Code Online (Sandbox Code Playgroud)
然后你以同样的方式处理它们.
编译器源没有说明为什么它有这个检查,但github历史记录说它是为响应这个错误而提交的:https://issues.dlang.org/show_bug.cgi?id = 3139
[s]所以它是编译器中的一个实现细节,以避免无限循环.[/ s]
编辑:实际上,256检查是在那之前,我读错了补丁,唐除了它添加了一个检查.看起来像github之前的256件事所以我不知道为什么它被特别添加,但我仍然非常有信心它与循环和内存问题有关,只是编译器实现细节和错误.