Выполнение этого как ответа, чтобы получить больше места.
Ограничение вы видите здесь не в спецификации 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]
EDIT: на самом деле проверка 256 была до этого, я неправильно прочитал патч, Дон добавил к нему чек. Похоже, что 256 штук предшествует github, поэтому я не знаю, почему он был специально добавлен, но я все еще довольно уверен, что он связан с этим циклом и проблемами памяти, а также с деталями и ошибками компилятора.
Каков код, выполняемый в каждом случае? –
в противном случае таблица переходов становится слишком большой. –
Переключайте 'switch' на диапазоны с помощью операторов' if', поэтому вы имеете только 64 оператора 'case' для' switch'. –