|
Оператор switch() в avr-gcc, как это должно быть по стандарту? |
|
|
|
Feb 22 2012, 09:05
|

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

|
читать стандарт С99 на английском весьма затруднительно для меня, поэтому прошу ответить тех, кто уже зубы съел на этих стандартах. в операторе switch допускается указывать до первого вхождения метки case любые операторы, то есть вот так МОЖНО (компилятор не ругается): Код switch(var){ somevar = 12; case 0: // some code here } однако avr-gcc полностью игнорирует эти "предварительные ласки", даже если somevar объявлена как volatile вопрос знатокам: есть ли тут какие-то ошибки, несоответствия стандарту и т.п. "нюансики"? если можно, но бесполезно - почему вообще можно? почему нет варнинга? если нельзя - почему нет ошибки? ну и так даее...
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
Feb 22 2012, 09:39
|
;
     
Группа: Участник
Сообщений: 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)  по идее, если НЕЛЬЗЯ так делать - так и нечего позволять... Наверное, в следующей редакции стандарта отделят мух от. Явная же ж недосказанность.
|
|
|
|
|
Feb 22 2012, 09:50
|

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

|
Цитата(ARV @ Feb 22 2012, 13:20)  о бесполезных вещах типа somevar; (если не volatile) компилятор предупреждает - тут молчок. По идее, должен предупредить, типа unreachable code/ Может, не все предупреждения включены? Попробуйте ключик -Wunreachable-code
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Feb 22 2012, 09:57
|

Профессионал
    
Группа: Свой
Сообщений: 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); } должно прокатить?
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
Feb 22 2012, 11:08
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 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 строки с подобным кодом, но предупреждение выпало только на первую их них... Есть предупреждения, которые выдаются только на одну строку. Тут — на первую строку фрагмента. Ещё бывает «переменная может использоваться без инициализации». Иногда он сам говорит, что предупреждение или ошибка выдаётся только на первое вхождение того, о чём ругань.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|