在案例范围内限制开关情况

Jac*_*ack 3 d case

我试图在案例交换机中包含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)

为什么编译器会施加这样的限制?为了达到最佳目的?我能克服它吗?

Ada*_*ppe 5

这样做可以获得更多空间.

您在此处看到的限制不在规范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件事所以我不知道为什么它被特别添加,但我仍然非常有信心它与循环和内存问题有关,只是编译器实现细节和错误.