case - 案例范围内开关案例的限制

标签 case d

我试图在大小写转换中包含 UTF-8 标识符,但出现此错误:

Error: had 399 cases which is more than 256 cases in case range

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/

相关文章:

c# - 使用 Case/Switch 和 GetType 来确定对象

sql-server - SQL Server : converting UniqueIdentifier to string in a case statement

sql - 查找当前行是否是要从数据库中选择的最后一行

mysql - SQL case 语句中的不等号似乎向后工作?

d - 如何打印inout参数?

templates - D 中柯里化(Currying)函数的模板?

d - 存在 `static if`时如何生成文档

vb.net - VB 2010 中的 Select Case 的多个条件

c++ - 使用 SWIG 包装 Octave 的 C++ API

interface - D 中范围 block 的基于流的处理