Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Чт окт 03, 2019 15:17:09
Прикольно. Чисто алгоритмически не важно это одна или много переменных, а за стек переживаем?
Да, речь о микроконтроллере. Посмотрел на
этот пример и заинтересовался почему структура
fno статическая. Раз она одна на все рекурсии, то видимо для экономии памяти при глубоких рекурсиях.
Чт окт 03, 2019 15:23:08
jcxz писал(а):От варнингов нужно избавляться всегда.
предела совершенству нет, но свобода воли присутствует всегда.
мы и дорогу не сегда переходим по зебре, и на красный свет, порой, перебегаем... оно то, конечно, не правильно, но можно
избавиться от многих варнингов нельзя в принципе. например, множество сторонних библиотек для функций указывают параметры типа char*, а я частенько это дело нарушаю и передаю uint8_t* или даже int8_t* . бывает и наоборот. и единственный способ избежать варнинга - тупо кастовать типы, а вот это самое я считаю более вредным и опасным, чем варнинги.
Чт окт 03, 2019 15:36:44
ARV, как раз явно преобразовать тип является признаком хорошего стиля. Только не надо это делать тупо )))
А вот в приведенном мной примере все варианты, кроме явного подавления предупреждения, увеличивают размер кода и понижают его производительность.
В общем случае, если в ночной сборке транка есть предупреждения - автор кода получит по шапке. Это уже без вариантов )
Чт окт 03, 2019 16:26:49
множество сторонних библиотек для функций указывают параметры типа char*, а я частенько это дело нарушаю и передаю uint8_t* или даже int8_t* . бывает и наоборот. и единственный способ избежать варнинга - тупо кастовать типы
вот и надо кастовать.
с варнингами такое дело - они на самом деле выдаются не просто так, а как указание, что возможно программист делает какую-то фигню. И ему предлагается либо подтвердить "да, я знаю, что делаю" - кастом, явным подавлением именно этого предупреждения или еще как - или разобраться и понять, что да, хрень придумал. И вот последний случай затруднителен, если там стопицот предупреждений, воспринимаемых в стиле "да там каста просто нет, ерунда, нормально же работает". Ну, мальчик слишком часто кричал "Волк!", а дальше мы знаем
Чт окт 03, 2019 16:41:35
Кстати, свежие gcc (8 и 9) довольно-таки круты: добавили очень много разных полезных проверок. Правда, выхлоп до сих пор сильно отстает от шланговского (благо, можно, не собирая шлангом, использовать его как лексический анализатор в qt-creator'е; но вот шланг почему-то не любит вложенные функции, а я их люблю). Зато пришлось в старый код втыкать уйму вещей: скажем, теперь выдается ошибка (просто я всегда собираю с -Wall -Werror -Wextra) на fallthrough в switch(). И приходится добавлять __attribute__ ((fallthrough)) в нужных местах (а то и макрос определять, если собираться это будет в разных версиях gcc)...
И к некоторым другим вещам строже стали относиться. Сижу вот, перелопачиваю чужой код, который на gcc4 без -Werror собирался, а на девятом отказывается. Да еще и приходится стиль c-89 на c-99 и позже переписывать.
Чт окт 03, 2019 17:03:34
jcxz, тут я с Вами не согласен. Простейший пример. Имеем таблицу указателей на функции. Пусть у функции один параметр. Причем части функций этот параметр просто не нужен, хотя остальные функции без него обойтись не могут. Получаем два варианта решения:
1. Игнорируем конкретное предупреждение о неиспольуемом значении параметра:
А в чём несогласны-то и почему? И зачем игнорировать если мы точно знаем что вызываем правильно - значит можно просто привести указатель к нужному типу и избавиться от варнинга.
Добавлено after 1 minute 46 seconds:Здесь обработчками ir_handler_pgm_prev(), ir_handler_pgm_next() и ir_handler_switch_channel() код нажатой кнопки на ИК пульте совершенно не нужен, тогда как обработчиками ir_handler_brightness() и ir_handler_pgm_no() он необходим.
Да - а ещё бывают значения аргументов "по-умолчанию". Как раз для такого случая.
Добавлено after 1 minute 32 seconds:Не знаю, насколько кошерно было моё решение, но я в подобном случае обьявлял статическую переменную с параметром команды. Или в моём случае статическую структуру с несколькими параметрами. Так я избавился от неоднозначности вызова.
Это очень кривое решение. Так как функция становится нереентрантной и потоко-небезопасной. На ровном месте.
Чт окт 03, 2019 17:05:26
Я обычно просто пишу в начале тела функции (void)unused_variable; - вполне достаточно, чтобы предупреждения исчезли. Если в дальнейшем в функции переменная unused_variable всё-таки понадобится - это просто убирается.
Чт окт 03, 2019 17:08:08
То есть, тут и близко не пахнет перегрузкой. Это разные функции выполняющие разные действия при возникновении подобных событий. В данном случае - нажатии разных кнопок на одном и том же пульте ДУ на ИК лучах.
...и даже при всём при этом никто не мешает использовать для них операцию приведения типа чтобы положить все указатели в один массив.
Не понимаю - в чём проблема?
Чт окт 03, 2019 17:08:16
WiseLord, значительно удобней написать где-нибудь в заголовочном файле, который все включают:
- Код:
#define _U_ __attribute__((__unused__))
Тогда [временно] ненужные аргументы обозначаются просто:
- Код:
type function(_U_ int arg1, _U_ int arg2, double arg3)...
Чт окт 03, 2019 17:21:45
jcxz, тут я с Вами не согласен. Простейший пример. Имеем таблицу указателей на функции. Пусть у функции один параметр. Причем части функций этот параметр просто не нужен, хотя остальные функции без него обойтись не могут. Получаем два варианта решения:
1. Игнорируем конкретное предупреждение о неиспольуемом значении параметра:
А в чём несогласны-то и почему? И зачем игнорировать если мы точно знаем что вызываем правильно - значит можно просто привести указатель к нужному типу и избавиться от варнинга.
Вы вообще о чем? О каком указателе и о каком типе речь?
Чт окт 03, 2019 17:25:37
Вы вообще о чем? О каком указателе и о каком типе речь?
А Вы о чём? Я о вашем комменте моего поста. С рассказом про разные указатели на функции. Не вижу там причин почему не нужно избавляться от варнингов.
Чт окт 03, 2019 17:27:02
приходится добавлять __attribute__ ((fallthrough)) в нужных местах (а то и макрос определять, если собираться это будет в разных версиях gcc)
его комментарием можно подавить
- Код:
switch(foo){
case FOO_VAL1:
do_something1();
break;
case FOO_VAL2:
do_something2();
// FALLTHROUGH
case FOO_VAL3:
do_something3();
default:
do_default_stuff();
}
https://gcc.gnu.org/onlinedocs/gcc/Warn ... allthroughСпойлер
it is also possible to add a fallthrough comment to silence the warning. The whole body of the C or C++ style comment should match the given regular expressions listed below. The option argument n specifies what kind of comments are accepted:
-Wimplicit-fallthrough=0 disables the warning altogether.
-Wimplicit-fallthrough=1 matches .* regular expression, any comment is used as fallthrough comment.
-Wimplicit-fallthrough=2 case insensitively matches .*falls?[ \t-]*thr(ough|u).* regular expression.
-Wimplicit-fallthrough=3 case sensitively matches one of the following regular expressions:
-fallthrough
@fallthrough@
lint -fallthrough[ \t]*
[ \t.!]*(ELSE,? |INTENTIONAL(LY)? )?
FALL(S | |-)?THR(OUGH|U)[ \t.!]*(-[^\n\r]*)?
[ \t.!]*(Else,? |Intentional(ly)? )?
Fall((s | |-)[Tt]|t)hr(ough|u)[ \t.!]*(-[^\n\r]*)?
[ \t.!]*([Ee]lse,? |[Ii]ntentional(ly)? )?
fall(s | |-)?thr(ough|u)[ \t.!]*(-[^\n\r]*)?
-Wimplicit-fallthrough=4 case sensitively matches one of the following regular expressions:
-fallthrough
@fallthrough@
lint -fallthrough[ \t]*
[ \t]*FALLTHR(OUGH|U)[ \t]*
-Wimplicit-fallthrough=5 doesn’t recognize any comments as fallthrough comments, only attributes disable the warning.
The comment needs to be followed after optional whitespace and other comments by case or default keywords or by a user label that precedes some case or default label.
Чт окт 03, 2019 17:40:46
Eddy_Em, проблема в том, что это исключительно конструкция GCC. В стандарте даже упоминания о таком нет. Тогда как #pragma стандартом специально зарезервирована для подобных применений. Если потребуется, например, на Clang переползать, что делать будете?
Добавлено after 39 seconds:
jcxz, хватит смешить народ и прочитайте, что написал я, а куда понесло Вас )))
Чт окт 03, 2019 19:01:04
Открываем стандарт С++17. Проблема ПростоНуб рашается [[maybe_unused]], а проблема Eddy_Em через [[fallthrough]]. И если для STM8 я могу понять "страдальцев", то тех кто сидя на GCC жалуется ну никак не понимаю.
Чт окт 03, 2019 19:04:43
сидя на gcc все равно хорошо бы писать переносимые конструкции.
Чт окт 03, 2019 19:40:52
С++17 для ARM поддерживает не только GCC.
Чт окт 03, 2019 19:42:15
для ARM.
ну и мы вроде как про C говорим, нет?)
Чт окт 03, 2019 19:53:17
В теме запрещены разговоры про С++? Я просто смотрю на проблему с другой стороны.
Чт окт 03, 2019 19:59:54
Открываем стандарт С++17.
При чем здесь кресты? Эмбеддеры на крестах не пишут! Кресты нужны исключительно для создания GUI на ненужной Qt!
Чт окт 03, 2019 20:12:33
VladislavS, я же Вам уже писал, что C++17 для продуктива пока не готов. Не надо бежать впереди паровоза. И мои проблемы не надо решать, так как я их давно решил при помощи pragma, что совместимо даже с C89/90.
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.