LINUX.ORG.RU

Как правильно оформлять switch?

 , , ,


1

2

А:

switch (i) {
    case 0:
        zero();
        break;
    case 1:
        one();
        break;
}
Б:
switch (i) {
case 0:
    zero ();
    break;
case 1:
    one ();
    break;
}
В:
switch (i) {
    case 0:
    zero();
    break;

    case 1:
    one();
    break;
}
Г:
switch(i)
{
    case 0:
        zero();
        break;
    case 1:
        one();
        break;
}
Или какой-то другой вариант?

★★★★★
Ответ на: комментарий от Pavval

раздуваешь из мухи слона, имхо.

Deleted
()
Ответ на: комментарий от Sorcerer

поставь брякпойнт на слово break в gdb, потом расскажешь как.

waker ★★★★★
()

Вариант Г более читабельный.

olibjerd ★★★★★
()
Ответ на: комментарий от post-factum
$ g++ t.cpp
t.cpp: In function ‘int main(int, char**)’:
t.cpp:17: warning: deprecated conversion from string constant to ‘char*’
t.cpp:20: error: jump to case label
t.cpp:17: error:   crosses initialization of ‘char* msg’
$ g++ --version
g++ (GCC) 4.2.1 (Gentoo 4.2.1_p5666-r2, Apple Inc. build 5666) (dot 3)
Copyright (C) 2007 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
andreyu ★★★★★
()
Ответ на: комментарий от beastie

Кхм, вообщето case — это и есть goto. ;)

Это понятно. Но я именно про скобочки/объявления переменных в case. Тут вот тоже считают, что это «bad style».

(И смысла там с скобках нет.)

Там нет, а тут, например, есть:

    int g = 0;
    switch (a) {
    case 1:
        g = 10;
        break;
    case 2: {
        int temp = 12;
        g = temp;
        break;
    }
    default:
        break;
    }

В том смысле, что если скобок нет — оно компилироваться не будет с очевидным:

error: a label can only be part of a statement and a declaration is not a statement
EXL ★★★★★
()
Ответ на: комментарий от andreyu

Ну ОК, раз о языке ничего не было сказано, то можно заметить, что в пхп такой код тоже не будет работать. Следуя твоей логике.

post-factum ★★★★★
()
Ответ на: комментарий от post-factum

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

Казалось бы, как можно спутать c/c++ с кодом на php.

Следуя твоей логике.

Нет, тут вы следуете только своей логике.

andreyu ★★★★★
()

Как тебе удобно или как принято в твоей команде разработчиков.

panter_dsd ★★★★
()
Ответ на: комментарий от post-factum

Это два разных языка.

Языки разные, но с - это подмножество с++. И по одному switch/case нельзя сказать с это или с++.

andreyu ★★★★★
()
Ответ на: комментарий от post-factum

Шо ж это подмножество твоим надмножеством не компилится?

Может потому, что ваш костыль не очень хороший?

andreyu ★★★★★
()
Ответ на: комментарий от post-factum

Хотелось бы услышать объяснение различия в поведении компиляторов.

С++ более строг. Вас же не смущает разное назначение ключевого слова auto в этих языках.
Так же вас наверное не смущает «старый» способ описания аргументов функций в Си.

andreyu ★★★★★
()
Ответ на: комментарий от post-factum

Это всё слова. Нужны ссылки на параграфы стандартов.

Какие именно пруфы вам нужны?

andreyu ★★★★★
()
Ответ на: комментарий от andreyu

Может потому, что ваш костыль не очень хороший?

на примере ядра: однажды разработчики решают избавиться от поддержки кода связанного с подсистемой EISA
кагбэ компы с исой это подмножество компов без исы ...
но в один прекрасный момент они перестают работать на новых версиях ядер (работают, там хепи-энд, не то что тут)

ткчто не стоит считать что все компиляторы cpp должны поддерживать С
С это С, а цпп - цпп
в один прекрасный момент решаем что в цпп некоторые объявления из С больше не поддерживаем, т.к. это компилятор цпп и нефик сюда тянуть все ився, ... и фсе
з.ы. всякие deprecated кагбэ намекают, но уважаемый видимо хочет потроллить и сам все прекрасно понимает

anTaRes ★★★★
()
Ответ на: комментарий от nanoolinux

табы в отступах - дегенеративизм.

О, еще один табофоб

Сколько у вас пробелов в отступах? Как у всех, 5? Или 7, чтоб удобнее было читать?

anonymous
()
Ответ на: комментарий от nanoolinux

i == 0 ? zero(): one();

иногда (в некоторых языках) такие штуки можно применять:
i == 0 ?: one();
или i = one() || 0;
от кода зависит, но да, я тоже на темной стороне ;)

свичи без дефолта - уныло. табы в отступах - дегенеративизм.

насчет табов тоже согласен, иногда нужно по-быстрому открыть код в какомнть «блокноте» и пофиксить одну строчку, а «перед глазами все плывет», бо разработчик посчитал инвалидами всех кто не способен настроить отступы в IDE

anTaRes ★★★★
()
Ответ на: комментарий от nanoolinux

свичи без дефолта - уныло

Самое то, когда нужно не просрать ни одно значение из перечисления.

anonymous
()

А... Для любителей скобок в одну линию - Г.

xterro ★★★★★
()
Ответ на: комментарий от anonymous

Когда-то кто-то мне рассказывал о чём-то, связанном со стеком, но я не помню, о чём именно и почему, так что просто привык и считаю это как минимум красивым.

post-factum ★★★★★
()
Ответ на: комментарий от post-factum

В спп можно опускать аргумент, а в С - нет. (void)unused нужен только для С, что бы ворнинга не было вроде.

А про стек подробней пожалуйста или не было.

nanoolinux ★★★★
()
Ответ на: комментарий от post-factum

Чтоб lint не ругался, делаешь:

/* ARGSUSED */
int
foobar(int unused, int args)
{
        /* ... */
}

И за одно:

switch (x) {
case 'a':
        whatever();
        /* FALLTHROUGH */
case 'b':
        whatever_else();
        break;
}
Будет не только подсказка lint'у, но и хорошим тоном.

beastie ★★★★★
()
Последнее исправление: beastie (всего исправлений: 1)
Ответ на: комментарий от anonymous

Но друзья не стали меня слушать, а пришли, побили, и выломали кнопку таб из клавиатуры. Теперь в миднайт командере я не могу переключаться между панелями, и моя жизнь наполнилась болью

ctrl-i Только тсссс, никому не говори. Это секрет.

akk ★★★★★
()
Ответ на: комментарий от nanoolinux

зато когда это перечисление расширишь, а в свиче нет дефота, получишь уб, не?

Когда в свитче нет дефолта и не обрабатываются все элементы перечисления гцц выдает варнинг

warning: enumeration value ‘...’ not handled in switch [-Wswitch]
anonymous
()
Ответ на: комментарий от anonymous

довольно часто встречается вариант с return (вместо или до brake;)
где после свитча обрабатывается вся остальная часть кода

anTaRes ★★★★
()
Ответ на: комментарий от nanoolinux

А про стек подробней пожалуйста или не было.

Не могу. Освежу память у своего гуру и тогда скажу.

post-factum ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.