C фигурные скобки на каждый случай после каждого случая - PullRequest
37 голосов
/ 22 ноября 2010

В управлении потоком C switch-case требуется поставить фигурные скобки {} после case, если в этом блоке определены переменные.

Это плохая практикаставить фигурные скобки после каждого case, независимо от объявления переменной?

Например:

switch(i) {
  case 1: {
    int j = 4;
    ...code...
  } break;

  case 2: {  //No variable being declared! Brace OK?
    ...code...
  } break;
}

Ответы [ 5 ]

37 голосов
/ 22 ноября 2010

Конечно, использование скобок в каждом блоке не является недопустимым, и это не обязательно плохой стиль.Если у вас есть несколько блоков case с фигурными скобками из-за объявлений переменных, добавление фигурных скобок к другим может сделать стиль кодирования более согласованным.

При этом, вероятно, не стоит объявлять переменные внутри блоков case напрямуюC. Хотя это может быть разрешено вашим компилятором, возможно, есть более чистое решение.Взаимно исключающие блоки case могут иметь возможность совместно использовать несколько общих временных переменных, или вы можете обнаружить, что ваши блоки case будут лучше работать в качестве вспомогательных функций.

10 голосов
/ 22 ноября 2010

Скобки могут использоваться в каждом операторе case без какого-либо снижения скорости из-за того, как компиляторы оптимизируют код.Так что это просто стиль и предпочтения кодера.

  • Наиболее предпочтительное использование - это не использование фигурных скобок, хотя их использование в каждом случае во время активной разработки может оказаться прощевремя от времени вносите в код некоторые дополнения.

  • Это просто восточная медицина;потому что оператор 'case' не требует только одной команды, он будет проходить через код, поскольку он работает как метка.Таким образом, блоки не нужны и не являются недействительными.

  • В случае с переменными;Скобки используются на всякий случай, для создания контекстов для переменных, и имеет смысл использовать их.Некоторые компиляторы на разных платформах показывают разное поведение, если они не включены.

5 голосов
/ 22 ноября 2010

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

. В C99 даже есть случай, когда перепрыгивание через инициализацию недопустимо, а именно, для массивов переменной длины.Они должны быть «сконструированы» так же, как и не-POD в C ++, их инициализация необходима для доступа к переменной позже.Так что в этом случае вы должны использовать оператор блока.

1 голос
/ 22 ноября 2010

Я считаю плохим стилем использовать скобки в каждом case. Случаи являются ярлыками на С, сродни goto ярлыкам. И в текущем языке C вы можете свободно объявлять переменные в каждом case (или где угодно), не вводя новые блоки, хотя некоторые люди (включая меня) также считают этот плохой стиль.

0 голосов
/ 19 ноября 2015

Просто чтобы добавить второстепенную точку, многие редакторы и IDE позволяют свернуть блоки и / или автоматически сделать отступ, а некоторые позволяют перейти к соответствующей скобке - лично я не знаю ни одной, которая позволяла бы вам прыгать с перерывас соответствующим оператором case.

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

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

...