我正在尝试在 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/