Объявление переменных внутри C switch / case - PullRequest
7 голосов
/ 25 ноября 2010

Ну, на самом деле это не вопрос ..

Я только что случайно обнаружил, что есть интересный способ объявить локальные переменные внутри блока switch / case.Вместо использования фигурных скобок внутри каждого блока case вы можете написать:

switch (action) {
  int res;
  int value;
case ACTION_OPEN:
  res = open(...);
  ...
  break;
case  ...
}

Итак, мне просто интересно, какие компиляторы C / C ++ помимо gcc поддерживают эту конструкцию?Это похоже на общий провал.Любые комментарии по этой конструкции приветствуются!

Ответы [ 4 ]

3 голосов
/ 25 ноября 2010

Тело переключателя - это просто нормальный оператор (в вашем случае составной оператор, похожий на { ... }), который может содержать любое дерьмо. Включая ярлыки на корпусах.

Эта философия переключателя используется Duffs device .

Многие люди не понимают, что даже что-то вроде switch(0) ; является допустимым утверждением (вместо составного утверждения оно имеет нулевое утверждение в качестве тела), хотя и совершенно бесполезно.

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

Любой соответствующий стандартам компилятор C или C ++ позволит это сделать.Даже старомодный (до ISO C99) C-компилятор позволит это, но только потому, что объявления переменных находятся в начале инструкции block / составной (обозначается {}).

Обратите внимание, чтоследует switch - почти нормальное утверждение, за исключением возможной метки регистра:

int main(int argc, char* argv[])
{
    switch (argc)
      default:
        puts("Hello, world!");

    return 0;
}

Так что в ANSI C89 здесь используются фигурные скобки.

0 голосов
/ 25 ноября 2010

Строго говоря, случай, который вы указываете с int, разрешен на всех трех языках, но по разным причинам.

C позволяет переходить через определение любой локальной переменной (арифметика, struct, union, массив ...) во всех случаях (для C89) и во всех случаях, кроме одного (для C99). Исключением для C99 являются массивы переменной длины.

C ++ допускает это только для типов данных, которые не имеют конструктора или деструктора, часто называемого POD.

Так что если у вас есть тип T вместо int в вашем примере в C89, это всегда допустимо, а в C99 и C ++ это зависит от типа T, является ли это правильным.

В любом случае, все это легко приводит к неинициализированным переменным, поэтому лучше не делать этого, если вы можете избежать этого.

0 голосов
/ 25 ноября 2010

Я думаю, что C99 позволяет объявлять переменные (почти) везде, где вы хотите, внутри блоков, так что поведение должно рассматриваться как допустимое ... и я не вижу фактического риска, так как это всего лишь объявление.

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