реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Оператор switch() в avr-gcc, как это должно быть по стандарту?
ARV
сообщение Feb 22 2012, 09:05
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



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

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


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

вопрос знатокам: есть ли тут какие-то ошибки, несоответствия стандарту и т.п. "нюансики"? если можно, но бесполезно - почему вообще можно? почему нет варнинга? если нельзя - почему нет ошибки? ну и так даее...


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
Xenia
сообщение Feb 22 2012, 09:14
Сообщение #2


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



А в каком случае вы хотели бы, чтобы выполнялась инструкция "somevar = 12;" ?
Go to the top of the page
 
+Quote Post
ARV
сообщение Feb 22 2012, 09:20
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



речь не о том, чего бы я хотел, а том, как это понимать. о бесполезных вещах типа somevar; (если не volatile) компилятор предупреждает - тут молчок. по идее, если НЕЛЬЗЯ так делать - так и нечего позволять...

теоретически вполне могли бы все до-case-евские операторы выполняться всегда, да и все...


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Feb 22 2012, 09:39
Сообщение #4


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Там всё понятно написано
Код
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) *
по идее, если НЕЛЬЗЯ так делать - так и нечего позволять...

Наверное, в следующей редакции стандарта отделят мух от. Явная же ж недосказанность.
Go to the top of the page
 
+Quote Post
ARV
сообщение Feb 22 2012, 09:40
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



то есть писать можно все, что угодно, но по сути это будет воспринято, как комментарий, т.е. проигнорировано?


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Feb 22 2012, 09:43
Сообщение #6


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Как это все что угодно? А декларации? Они не проигнорированы.
пперевожу
Объект i с классом памяти "авто" существует (внутри блока) но никогда не может быть инициализирован... ... Точно так же, вызов функции f недоступен.

Сообщение отредактировал _Pasha - Feb 22 2012, 09:48
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Feb 22 2012, 09:50
Сообщение #7


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(ARV @ Feb 22 2012, 13:20) *
о бесполезных вещах типа somevar; (если не volatile) компилятор предупреждает - тут молчок.

По идее, должен предупредить, типа unreachable code/
Может, не все предупреждения включены?
Попробуйте ключик -Wunreachable-code


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
ARV
сообщение Feb 22 2012, 09:57
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



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




--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Feb 22 2012, 10:00
Сообщение #9


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Да. int i; имеет смысл, а int i =4; - не имеет.
Go to the top of the page
 
+Quote Post
ARV
сообщение Feb 22 2012, 10:06
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Цитата(MrYuran @ Feb 22 2012, 13:50) *
Попробуйте ключик -Wunreachable-code
было -Wall... с вашим советом Warning появился, но какой-то странный: я сделал 2 строки с подобным кодом, но предупреждение выпало только на первую их них...


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Feb 22 2012, 11:08
Сообщение #11


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(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 строки с подобным кодом, но предупреждение выпало только на первую их них...
Есть предупреждения, которые выдаются только на одну строку. Тут — на первую строку фрагмента.
Ещё бывает «переменная может использоваться без инициализации».
Иногда он сам говорит, что предупреждение или ошибка выдаётся только на первое вхождение того, о чём ругань.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Feb 22 2012, 11:11
Сообщение #12


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(ReAl @ Feb 22 2012, 15:08) *
Ещё бывает «переменная может использоваться без инициализации».

т.е. если
Код
void foo()
{
    goto lab1;
    {
        int a = 0;//именно тот случай
lab1:
        a = 3;
        return;
        a = 4;  // unreachable code
    }
}
Go to the top of the page
 
+Quote Post
ReAl
сообщение Feb 22 2012, 11:12
Сообщение #13


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(_Pasha @ Feb 22 2012, 12:00) *
Да. int i; имеет смысл, а int i =4; - не имеет.
static int i = 4; имел бы.
Такая вот ну очень глубокая инкапсуляция :-)


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
ARV
сообщение Feb 23 2012, 11:09
Сообщение #14


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



ну не доходит до меня глубинный смысл милостивого позволения объявить никому не нужную переменную sad.gif
оказывается, не только в наших ГОСТАах имеются глупости...


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Feb 23 2012, 11:54
Сообщение #15


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Почему ненужную? У этих объявлений просто нет исполняемой части
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th July 2025 - 05:47
Рейтинг@Mail.ru


Страница сгенерированна за 0.01483 секунд с 7
ELECTRONIX ©2004-2016