Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Оператор switch() в avr-gcc
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
ARV
читать стандарт С99 на английском весьма затруднительно для меня, поэтому прошу ответить тех, кто уже зубы съел на этих стандартах.

в операторе switch допускается указывать до первого вхождения метки case любые операторы, то есть вот так МОЖНО (компилятор не ругается):
Код
switch(var){
   somevar = 12;
   case 0:
      // some code here
}


однако avr-gcc полностью игнорирует эти "предварительные ласки", даже если somevar объявлена как volatile

вопрос знатокам: есть ли тут какие-то ошибки, несоответствия стандарту и т.п. "нюансики"? если можно, но бесполезно - почему вообще можно? почему нет варнинга? если нельзя - почему нет ошибки? ну и так даее...
Xenia
А в каком случае вы хотели бы, чтобы выполнялась инструкция "somevar = 12;" ?
ARV
речь не о том, чего бы я хотел, а том, как это понимать. о бесполезных вещах типа somevar; (если не volatile) компилятор предупреждает - тут молчок. по идее, если НЕЛЬЗЯ так делать - так и нечего позволять...

теоретически вполне могли бы все до-case-евские операторы выполняться всегда, да и все...
_Pasha
Там всё понятно написано
Код
EXAMPLE In the artificial program fragment
switch (expr)
{
int i = 4;
f(i);
case 0:
i=17;
/*falls through into default code */
default:
printf("%d\n", i);
}

Цитата
the object whose identifier is i exists with automatic storage duration (within the block) but is never
initialized
, and thus if the controlling expression has a nonzero value, the call to the printf function will
access an indeterminate value. Similarly,the call to the function f cannot be reached


Т.е. проблема в нечеткой формулировке. Всё, что имеет предназначение компилироваться в исполняемый код, будет игнорировано до первого case


Цитата(ARV @ Feb 22 2012, 13:20) *
по идее, если НЕЛЬЗЯ так делать - так и нечего позволять...

Наверное, в следующей редакции стандарта отделят мух от. Явная же ж недосказанность.
ARV
то есть писать можно все, что угодно, но по сути это будет воспринято, как комментарий, т.е. проигнорировано?
_Pasha
Как это все что угодно? А декларации? Они не проигнорированы.
пперевожу
Объект i с классом памяти "авто" существует (внутри блока) но никогда не может быть инициализирован... ... Точно так же, вызов функции f недоступен.
MrYuran
Цитата(ARV @ Feb 22 2012, 13:20) *
о бесполезных вещах типа somevar; (если не volatile) компилятор предупреждает - тут молчок.

По идее, должен предупредить, типа unreachable code/
Может, не все предупреждения включены?
Попробуйте ключик -Wunreachable-code
ARV
Цитата(_Pasha @ Feb 22 2012, 13:43) *
Как это все что угодно? А декларации? Они не проигнорированы.
пперевожу
Объект i с классом памяти "авто" существует (внутри блока) но никогда не может быть инициализирован... ... Точно так же, вызов функции f недоступен.
то есть
Код
switch(expr){
   int i = 4;
case 0:
   i = 2;
   printf("%d",i);
}
должно прокатить?


_Pasha
Да. int i; имеет смысл, а int i =4; - не имеет.
ARV
Цитата(MrYuran @ Feb 22 2012, 13:50) *
Попробуйте ключик -Wunreachable-code
было -Wall... с вашим советом Warning появился, но какой-то странный: я сделал 2 строки с подобным кодом, но предупреждение выпало только на первую их них...
ReAl
Цитата(ARV @ Feb 22 2012, 11:05) *
в операторе switch допускается указывать до первого вхождения метки case любые операторы, то есть вот так МОЖНО (компилятор не ругается):
Код
switch(var){
   somevar = 12;
   case 0:
      // some code here
}
однако avr-gcc полностью игнорирует эти "предварительные ласки", даже если somevar объявлена как volatile

Вот как раз (кажется, во второй раз на этом форуме, но не нашёл предыдущего... а, может, это на другом форуме было)
http://electronix.ru/forum/index.php?s=&am...t&p=1030014
Предупреждение на строку somevar = 12; может быть максимум Unreachable code, т.е. такое же, как на
Код
int a;

void foo()
{
    goto lab1;
    {
        a = 0; // unreachable code и никакой volatile не поможет, тут может быть только определение static-объекта
lab1:
        a = 3;
        return;
        a = 4;  // unreachable code
    }
}


Цитата(ARV @ Feb 22 2012, 12:06) *
было -Wall... с вашим советом Warning появился, но какой-то странный: я сделал 2 строки с подобным кодом, но предупреждение выпало только на первую их них...
Есть предупреждения, которые выдаются только на одну строку. Тут — на первую строку фрагмента.
Ещё бывает «переменная может использоваться без инициализации».
Иногда он сам говорит, что предупреждение или ошибка выдаётся только на первое вхождение того, о чём ругань.
_Pasha
Цитата(ReAl @ Feb 22 2012, 15:08) *
Ещё бывает «переменная может использоваться без инициализации».

т.е. если
Код
void foo()
{
    goto lab1;
    {
        int a = 0;//именно тот случай
lab1:
        a = 3;
        return;
        a = 4;  // unreachable code
    }
}
ReAl
Цитата(_Pasha @ Feb 22 2012, 12:00) *
Да. int i; имеет смысл, а int i =4; - не имеет.
static int i = 4; имел бы.
Такая вот ну очень глубокая инкапсуляция :-)
ARV
ну не доходит до меня глубинный смысл милостивого позволения объявить никому не нужную переменную sad.gif
оказывается, не только в наших ГОСТАах имеются глупости...
_Pasha
Почему ненужную? У этих объявлений просто нет исполняемой части
GetSmart
Цитата(ARV @ Feb 23 2012, 16:09) *
ну не доходит до меня глубинный смысл милостивого позволения объявить никому не нужную переменную sad.gif

А я такое проверял в ИАРе наверное пол года назад, когда Паша тему заводил про что-то вроде "как называется такая конструкция --> карусель".
И ИАР ругался на исполняемые команды до первого кейса. Объявлять там локальные переменные я тогда не догадался. Но спасибо, Паша, за подсказку sm.gif
_Pasha
Цитата(GetSmart @ Feb 23 2012, 16:26) *
А я такое проверял в ИАРе наверное пол года назад, когда Паша тему заводил про что-то вроде "как называется такая конструкция --> карусель".
И ИАР ругался на исполняемые команды до первого кейса. Объявлять там локальные переменные я тогда не догадался. Но спасибо, Паша, за подсказку sm.gif

Пожалуйста, только она не карусель вовсе. Надо будет тут повторить вопрос sm.gif
_Pasha
Тема была не тут а на Шараге
Собсна вопрос.
Код
#define step(what) state = __LINE__; what; break; case __LINE__:
int func(void)
{
  unsigned int state=0;
  do
    {
      switch(state)
      {
        case 0:
        step(fread(&obj, sizeof(obj),1,my_file)); // сначала выполнили одно действие из здеся
        step(fread(&obj, sizeof(obj),1,my_file));
        step(fread(&obj, sizeof(obj),1,my_file));
      }
      // затем здесь чегой-то пошаманили, после каждого действия
      int error =ferr(my_file);
      if(error) return error;
    }
  while(!feof(my_file)); // и перешли к выполнению след действия
return 0;
}

Есть ли у такой конструкции устойчивое название?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.