После прочтения всех ответов и еще нескольких исследований я получаю несколько вещей.
Case statements are only 'labels'
В C, в соответствии со спецификацией,
§6.8.1 помеченных операторов:
labeled-statement:
identifier : statement
case constant-expression : statement
default : statement
В C Существует не какой-либо пункт, который позволяет для «меченого декларации ». Это просто не язык.
Так
case 1: int x=10;
printf(" x is %d",x);
break;
Это не будет компилировать см http://codepad.org/YiyLQTYw. GCC дает ошибку:
label can only be a part of statement and declaration is not a statement
Даже
case 1: int x;
x=10;
printf(" x is %d",x);
break;
это также не компиляции см http://codepad.org/BXnRD3bu. Здесь я также получаю ту же ошибку.
В C++, в соответствии со спецификацией,
меченного декларация допускается, но помечены -initialization не допускается.
См. http://codepad.org/ZmQ0IyDG.
Решение такого состояния является два
Либо использовать новые возможности, используя {}
case 1:
{
int x=10;
printf(" x is %d", x);
}
break;
Или использовать фиктивное заявление с меткой
case 1: ;
int x=10;
printf(" x is %d",x);
break;
Объявите переменную перед переключателем() и инициализировать его с различными значениями в случае заявления, если оно удовлетворяет ваше требование
main()
{
int x; // Declare before
switch(a)
{
case 1: x=10;
break;
case 2: x=20;
break;
}
}
Некоторые другие вещи с переключателем заявления
Никогда не пишите любые заявления в коммутаторе, которые не являются частью какой-либо метки, поскольку они никогда не будут выполнены:
switch(a)
{
printf("This will never print"); // This will never executed
case 1:
printf(" 1");
break;
default:
break;
}
См. http://codepad.org/PA1quYX3.
Для объяснения, основанного на грамматике C BNF, см. Http://stackoverflow.com/questions/1180550/weird- switch-error-in-obj-c/1181106 # 1181106% 3E – johne 2010-01-12 03:30:11