|
|
  |
Косяк у Кейла, Препроцессор не следит за скобками |
|
|
|
Oct 17 2015, 11:06
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(Golikov A. @ Oct 17 2015, 11:10)  Если вы работаете один, на вашем коде не лежат риски жизни, вам все понятно и все знаете как кое кто, то писать можете как угодно. У меня много кода написано без (void) и ИАР всегда его правильно компилировал. Попытка компиляции одного из них в Кейле выдала варнинг, который я здесь обсудил. После таких угроз в ненадёжности мне любопытно, насколько они обоснованны. С секретными стандартами не знаком. Укажите, в чём неоднозначности толкования. Увод внимания с очевидно рискованных операторов вроде comma на ложную страшилку - типичный приём мошенничества. Если zltigo не прояснит заданный ему вопрос, а он умеет конструктивно аргументировать когда есть чем, то можно делать вывод, что нечем. Одновременность ввода void в стандарт для типа функции и для списка аргументов, которым он пытается "отбиться", пока тянет только на маскировку бесполезности/вредности второго нововведения. Или ещё можно предпологать (ака делать вид), что он знаком с военной тайной, которую простым смертным знать не полагается.
Сообщение отредактировал GetSmart - Oct 17 2015, 19:07
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Oct 17 2015, 13:37
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
конкретно про void как я понял в каких то дремучих годах, не было прототипов функций. и если вам надо было вызвать в коде функцию из другого файла (условно), да при этом она возвращала не int, то чтобы обозначит этот возвращаемый тип ввели то что тут назвали декларацией функции, то есть есть у нас Код char MyFunc(int a, char d) { ..... } мы хотим ее вызвать где-то в другом файле, и у нас нет прототипов, то есть нельзя подключить заголовочный файл с описанием char MyFunc(int a, char d); Тогда мы в начале этого файла где хотим вызвать пишем char MyFunc(); - то есть смысл указать что MyFunc возвращает char, и потому разрешили скобки оставить пустыми, то есть не важно что она принимает важно что она возвращает. Потом стандарты поменялись и ввели прототипы и как я понимаю для большей строгости решили разделить char MyFunc(); которая принимает кучу параметров и запись есть декларация возвращаемого значения и char MyFunc2(); которая на самом деле не принимает никаких значений, и потому в прототипах вторая указывается как char MyFunc2(void); Нужно ли тянуть все эти атавизмы до С89, когда уже и С99 не последний я не знаю. Сам я пишу для функций не принимающих значения явным образом void в скобках. Потому что это явно обозначает мои желания при объявлении функции. Текста мне, как и ударов по кнопкам не жалко, а может быть кого-то это спасет. Объявите где-то еще такую функцию, но с параметрами и сразу получите об этом сигнал. В то время как char MyFunc(); может трактоваться и как функция без параметров, так и функция с произвольным числом параметров. То есть это расширение в сторону большей определенности, чтобы не было что я думал будет так, а компилятор подумал что будет эдак. Хотя кто-то считает это малодушием и предлагает наизусть выучить как подумает компилятор, самому запомнить и тролить этим новичков, постоянно используя в коде всякие неоднозначные вещи...
|
|
|
|
|
Oct 17 2015, 19:46
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Буду считать, что компромисс с микробами. --------------- Проверил на ИАР. Он не выдаёт даже ремарки на вызов через декларацию с заданием любого кол-ва арументов. C FatFS и "(void) переменная" напутал. Это был NXP UsbHostLite. Там (void) применялся к аргументу функции (указатель но волатил-массив) без его использования "(void) arg;". В исходниках EHCI тоже встречается преобразователь типа - (void), но стоит перед некоторыми вызовами некоторых (в т.ч. статик) функций, возвращающих значения. Фунции, судя по логике программы, вызываются. Значение отбрасыватся. Но и без (void) оно должно отбрасываться без замечаний компилятора. Вызов этих функций там есть и без (void) с отбрасыванием результата. Что же хотел сказать автор? Напоминает крики о помощи подневольных программистов
Сообщение отредактировал GetSmart - Oct 18 2015, 15:23
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Oct 19 2015, 07:02
|
Частый гость
 
Группа: Участник
Сообщений: 139
Регистрация: 9-11-12
Из: Санкт-Петербург
Пользователь №: 74 315

|
Цитата(zltigo @ Oct 19 2015, 09:59)  На деле просто чушь с точки зрения компилятора. А может, это обход ругани каких-нибудь особо дотошных статических анализаторов кода?
|
|
|
|
|
Oct 19 2015, 07:50
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(GetSmart @ Oct 17 2015, 22:46)  В исходниках EHCI тоже встречается преобразователь типа - (void), но стоит перед некоторыми вызовами некоторых (в т.ч. статик) функций, возвращающих значения. Фунции, судя по логике программы, вызываются. Значение отбрасыватся. Но и без (void) оно должно отбрасываться без замечаний компилятора. Вызов этих функций там есть и без (void) с отбрасыванием результата. Что же хотел сказать автор? Автор хотел сказать, что, дескать, я не забыл, что функция возвращает значение, просто я его нарочно игнорирую. К тому же некоторые компиляторы могут выдавать предупреждение "возвращаемое значение не используется", и приведение к void помогает подавить это предупреждение.
|
|
|
|
|
Oct 20 2015, 16:34
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (Golikov A. @ Oct 20 2015, 16:50)  вот типа того CODE ... if (cond1) goto end .... if(cond2) goto end .... :end .... ... вот такой код, надо не трогая структуру не трогая то что под ... переписать чтобы не было goto, а логика работы осталась прежней... Для чего "надо"? А для чего вообще надо было писать это дерьмо с goto, потом для неведомо чего усугублять оставляя изначальное дерьмо но без goto следуя дебильному лозунгу "goto вредно"? А написать сразу по человечески что мешало? Ну а способов, как оставить "похоже" множество. Самые безобидные: CODE static void dummy(void) { if (cond1) return; .... if(cond2) return; .... } CODE ...
for(;; ) { if (cond1) break; .... if(cond2) break; .... break; } Из серии наворотить дальше, наряду с Вашим любимым и "незаменимым" while{}do(0) можно писать чего угодно, да хоть switch(0){} Только нафига
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
  |
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0
|
|
|