по умолчанию в начале блока переключателей - PullRequest
4 голосов
/ 07 февраля 2012

При прохождении кода для парсера, например Parser.cpp в каталоге clang / Parse компилятора clang

switch (Close) {
default: break;
case tok::r_paren : LHSName = "("; DID = diag::err_expected_rparen; break;
case tok::r_brace : LHSName = "{"; DID = diag::err_expected_rbrace; break;
case tok::r_square: LHSName = "["; DID = diag::err_expected_rsquare; break;
case tok::greater:  LHSName = "<"; DID = diag::err_expected_greater; break;
case tok::greatergreatergreater:
                    LHSName = "<<<"; DID = diag::err_expected_ggg; break;
}

Я вижу, что default находится в начале. Есть ли какая-то причина, чтобы держать это так. Обычно мы держим default в конце, поэтому я немного растерялся.

Ответы [ 2 ]

1 голос
/ 07 февраля 2012

Порядок не имеет значения, если вы включили свои break с.

В качестве отступления, я бы хотел поставить break сразу перед каждые case или default.Гораздо проще проверить, что это правило соблюдается, чем пытаться заглянуть в конец каждого оператора case.

switch (Close) {
  break; default:
  break; case tok::r_paren : LHSName = "("; DID = diag::err_expected_rparen;
  break; case tok::r_brace : LHSName = "{"; DID = diag::err_expected_rbrace;
  break; case tok::r_square: LHSName = "["; DID = diag::err_expected_rsquare;
  break; case tok::greater:  LHSName = "<"; DID = diag::err_expected_greater;
  break; case tok::greatergreatergreater: LHSName = "<<<"; DID = diag::err_expected_ggg;
}

Возможно, вам будет проще понять, если вы интерпретируете break как «Не проваливайте в этот случай из любого другого случая». вместо «Не проваливайте из этого случая в любой последующий случай.«

В этом макете очень легко увидеть, отсутствует ли break, и, следовательно, вынуждая писателя (и читателя) спросить себя« хочу ли ячерез здесь?Все break хорошо выстраиваются в линию, и это очень очевидно, если кто-то отсутствует.

Уточнение: в моем ответе нет «волшебства».Я просто размещаю свой пробел таким образом, чтобы он был намного более читабельным для меня.И пробелы не имеют значения, поэтому я могу это сделать.break в самом конце switch является избыточным.Если отсутствует, компилятору не разрешается переходить к вершине switch, как если бы это был какой-то цикл while.Точно так же избыточный break в самом начале switch ничего не меняет и должен быть принят (и проигнорирован) компилятором.

0 голосов
/ 07 февраля 2012

Единственный раз, когда я вижу положение вопроса по умолчанию, это когда происходит что-то подобное, это конструкция типа Duff's Device , которая, вероятно, никогда не должна применяться на современных платформах. :)


void copyAligned4Bytes(u32 *in, u32 *out, int numBytes)
{
  assert((numBytes & 0x03) == 0);

  while(numBytes)
  {
    switch(numBytes)
    {
      default: *out++ = *in++; numBytes -= 4;
      case 12: *out++ = *in++; numBytes -= 4;
      case 8: *out++ = *in++; numBytes -= 4;
      case 4: *out++ = *in++; numBytes -= 4;
    }
  }
}

Ах, радости кодирования на C как можно ближе к ассемблеру, чтобы получить таблицу переходов определенного типа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...