3

В интересах будущих читателей и моего собственного здравомыслия позже я хотел бы абсолютно четко заявить, что switch заявления, которые не имеют случая default (из-за всех закрытых случаев) или последовательный if-elseif-else с последним, который ничего не должен делать, не следует опускать и включать комментарий к этому вопросу (см. пример).C++: оператор switch отсутствует точка с запятой перед закрывающей скобкой

Однако всякий раз, когда я включаю default дело в switch заявление и оставить его пустым, я должен поставить точку с запятой внутри default случая или ошибки компилятора: "Line [Линия закрытия скобки переключателя заявления]` отсутствующего „;“ до '}' ". ПОЧЕМУ ?!

Пример: ГЕНЕРИРУЕТ Ошибка компилятора

switch(direction) { 
    case MOVE_UP: 
    //... 
    break; 
    case MOVE_RIGHT: 
    //... 
    break; 
    case MOVE_DOWN: 
    //... 
    break; 
    case MOVE_LEFT: 
    //... 
    break; 
    default: 
     /* DO NOTHING */ 
} 

Пример: НЕ СОЗДАТЬ Ошибка компилятора

switch(direction) { 
    case MOVE_UP: 
    //... 
    break; 
    case MOVE_RIGHT: 
    //... 
    break; 
    case MOVE_DOWN: 
    //... 
    break; 
    case MOVE_LEFT: 
    //... 
    break; 
    default: 
     /* DO NOTHING */; 
} 
+1

FYI случай по умолчанию является необязательным в C++ ... – AJG85

+3

Если вы хотите быть последовательным, поместите «break;» после значения по умолчанию. –

ответ

9

6,1/1 в C++ 03 дает грамматику для меченого-высказывания:

 
labeled-statement: 
    identifier : statement 
    case constant-expression : statement 
    default : statement 

C++ 11 таких же, за исключением того, что вы можете иметь атрибуты до метки.

нулевой длиной последовательность лексем не заявления в C++, поэтому default: сами по себе не является мечеными-заявление.

Сказанное, я не знаю, какова была мотивация, почему грамматика для с меткой-заявлением не позволяет default: statementopt. Если это так, то не было бы грамматической неоднозначности, если вы написали default : case 1: break;, будь то case 1: break; является утверждение принадлежности к default:, или default: не о своей собственной, но сразу же следует за другим. Там до сих пор нет сомнений, что это означает, но, возможно, считалось, что это испортит парсеры людей.

+1

Изменение этого на принятый ответ. Ссылки на победу. – Casey

12

Потому что вам нужно заявление для default случая. Точка с запятой - это пустой оператор.

Смежные вопросы