Мне интересно, все ли компиляторы будут игнорировать код перед метками в операторе 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");
}
Из стандарта кажется очевидным, что первый «разрыв» (и любой другой код, если он существует) не будет выполнен. Стандарт не отрицает существование такого кода, но я не могу быть уверен в реальных компиляторах.
Да, это подразумевается §6.4.2¶5 (в частности, игнорирующей частью):
Когда оператор switch выполняется, его состояние оценивается и сравнивается с каждой константой case. Если
одна из констант в регистре равна значению условия, управление передается оператору
соответствующая этикетка. Если никакая константа не соответствует условию, и если есть метка по умолчанию, управляйте
переходит к оператору, помеченному меткой по умолчанию. Если не найдено ни одного случая, и если по умолчанию нет
ни один из операторов в переключателе не выполняется.
Однако я не думаю, что ваш макрос — хорошая идея.
Лично я был бы «неспособен» написать такой код, так как все предупреждения превращаются в ошибки, и предупреждение о недостижимом коде вероятно … и на самом деле быстрый тест на clang ++ выводит такое предупреждение.