我正在尝试在 case switch 中包含 UTF-8 标识符,但出现此错误:



D代码:

    switch(value)
    {
        case 'a': ..  case 'z':
        case 'A': ..  case 'Z':
        case 0xC0: .. case 0x24F:

为什么编译器会施加这样的限制?出于优化目的?我能克服它吗?

最佳答案

这样做是为了获得更多空间。

您在此处看到的限制不在规范 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;
}

因此,解决方法是将该范围分成几部分并将它们彼此相邻放置:
        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

然后你以同样的方式处理它们。

编译器源代码没有说明为什么要进行该检查,但是 github 历史记录说它是针对此错误提交的:https://issues.dlang.org/show_bug.cgi?id=3139

[s]所以它是编译器中的一个实现细节,以避免死循环。[/s]

编辑:实际上,256检查在那之前,我读错了补丁,Don在它之外添加了一个检查。看起来 256 东西在 github 之前,所以我不知道为什么特别添加它,但我仍然非常有信心它与循环和内存问题有关,只是编译器实现细节和错误。

关于case - 案例范围内开关案例的限制,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25536069/

10-13 04:49