我试图在大小写转换中包含 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/