переключиться с кодом, написанным перед метками, это нормально?

Мне интересно, все ли компиляторы будут игнорировать код перед метками в операторе switch, как это делает VS2005.

Вот то, что я после:

#define CASE break; case

Так,

switch (i) {
CASE 0:  print("0");
CASE 1:  print("1");
}

превратится в

switch (i) {
break;
case 0:  print("0");  break;
case 1:  print("1");
}

Из стандарта кажется очевидным, что первый «разрыв» (и любой другой код, если он существует) не будет выполнен. Стандарт не отрицает существование такого кода, но я не могу быть уверен в реальных компиляторах.

4

Решение

Да, это подразумевается §6.4.2¶5 (в частности, игнорирующей частью):

Когда оператор switch выполняется, его состояние оценивается и сравнивается с каждой константой case. Если
одна из констант в регистре равна значению условия, управление передается оператору
соответствующая этикетка. Если никакая константа не соответствует условию, и если есть метка по умолчанию, управляйте
переходит к оператору, помеченному меткой по умолчанию. Если не найдено ни одного случая, и если по умолчанию нет
ни один из операторов в переключателе не выполняется.

Однако я не думаю, что ваш макрос — хорошая идея.

4

Другие решения

Лично я был бы «неспособен» написать такой код, так как все предупреждения превращаются в ошибки, и предупреждение о недостижимом коде вероятно … и на самом деле быстрый тест на clang ++ выводит такое предупреждение.

1

По вопросам рекламы [email protected]