Перейти к содержанию
    

Все зависит от области где вы работаете и от вашей внутренней самодисциплины.

Если вы работаете один, на вашем коде не лежат риски жизни, вам все понятно и все знаете как кое кто, то писать можете как угодно.

 

Если у вас есть корпоративные правила, если у вас есть ГОСТы на ПО и прочее, то писать надо как предписывают правила.

 

Если вы работаете в команде и у вас есть стиль, то писать надо как предписывает стиль, чтобы команде было удобно работать....

 

Не надо думать что как и почему, зачем в стандарте. Выберите свой путь из допустимых и вперед....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если вы работаете один, на вашем коде не лежат риски жизни, вам все понятно и все знаете как кое кто, то писать можете как угодно.

У меня много кода написано без (void) и ИАР всегда его правильно компилировал. Попытка компиляции одного из них в Кейле выдала варнинг, который я здесь обсудил. После таких угроз в ненадёжности мне любопытно, насколько они обоснованны. С секретными стандартами не знаком. Укажите, в чём неоднозначности толкования. Увод внимания с очевидно рискованных операторов вроде comma на ложную страшилку - типичный приём мошенничества.

 

Если zltigo не прояснит заданный ему вопрос, а он умеет конструктивно аргументировать когда есть чем, то можно делать вывод, что нечем. Одновременность ввода void в стандарт для типа функции и для списка аргументов, которым он пытается "отбиться", пока тянет только на маскировку бесполезности/вредности второго нововведения. Или ещё можно предпологать (ака делать вид), что он знаком с военной тайной, которую простым смертным знать не полагается.

Изменено пользователем GetSmart

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

конкретно про 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(); может трактоваться и как функция без параметров, так и функция с произвольным числом параметров. То есть это расширение в сторону большей определенности, чтобы не было что я думал будет так, а компилятор подумал что будет эдак.

Хотя кто-то считает это малодушием и предлагает наизусть выучить как подумает компилятор, самому запомнить и тролить этим новичков, постоянно используя в коде всякие неоднозначные вещи...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Буду считать, что компромисс с микробами.

 

---------------

 

Проверил на ИАР. Он не выдаёт даже ремарки на вызов через декларацию с заданием любого кол-ва арументов.

 

C FatFS и "(void) переменная" напутал. Это был NXP UsbHostLite. Там (void) применялся к аргументу функции (указатель но волатил-массив) без его использования "(void) arg;".

 

В исходниках EHCI тоже встречается преобразователь типа - (void), но стоит перед некоторыми вызовами некоторых (в т.ч. статик) функций, возвращающих значения. Фунции, судя по логике программы, вызываются. Значение отбрасыватся. Но и без (void) оно должно отбрасываться без замечаний компилятора. Вызов этих функций там есть и без (void) с отбрасыванием результата. Что же хотел сказать автор?

 

Напоминает крики о помощи подневольных программистов :)

Изменено пользователем GetSmart

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проверил на ИАР. Он не выдаёт даже ремарки на вызов через декларацию с заданием любого кол-ва арументов.

 

Так компилируйте в режиме С++, в чем проблема-то?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В исходниках EHCI тоже встречается преобразователь типа - (void), но стоит перед некоторыми вызовами некоторых (в т.ч. статик) функций, возвращающих значения. Фунции, судя по логике программы, вызываются. Значение отбрасыватся. Но и без (void) оно должно отбрасываться без замечаний компилятора. Вызов этих функций там есть и без (void) с отбрасыванием результата. Что же хотел сказать автор?

Я тоже такое видел не раз. Гипотетически как-то может помочь оптимизации при встаивании static функции. На деле просто чушь с точки зрения компилятора. Но писателю исходников может так нравится.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На деле просто чушь с точки зрения компилятора.

А может, это обход ругани каких-нибудь особо дотошных статических анализаторов кода?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А может, это обход ругани каких-нибудь особо дотошных статических анализаторов кода?

Как вариант. Но лично я встречал сие весьма хаотически разбросанное по исходнику. Могу найти образчик, ибо с месяц назад вычитывал один исходник от Jennic - помнится там сие встречалось. Сам исходник был такой, что хоть святых выноси :(, но являлся частью вынуждено вынесенного на всеобщее обозрение стека и действительно вполне мог писан с соблюдением каки-то формальных требований.

 

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В исходниках EHCI тоже встречается преобразователь типа - (void), но стоит перед некоторыми вызовами некоторых (в т.ч. статик) функций, возвращающих значения. Фунции, судя по логике программы, вызываются. Значение отбрасыватся. Но и без (void) оно должно отбрасываться без замечаний компилятора. Вызов этих функций там есть и без (void) с отбрасыванием результата. Что же хотел сказать автор?

Автор хотел сказать, что, дескать, я не забыл, что функция возвращает значение, просто я его нарочно игнорирую. К тому же некоторые компиляторы могут выдавать предупреждение "возвращаемое значение не используется", и приведение к void помогает подавить это предупреждение.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В бессмысленности получившегося выражения. По этой причине прилично-бы выдать warning. IAR-у можно включить. Но у большинства - нет :(

Вообще-то этот трюк позволяет энкапсулировать макрос. И еще мне когда-то надо было избежать goto и данное решение легко позволяет заменить его на break.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вообще-то этот трюк позволяет энкапсулировать макрос. И еще мне когда-то надо было избежать goto и данное решение легко позволяет заменить его на break.

Готов рассмотреть КОНКРЕТНО обе Ваших "проблемы". Дайте этих два кусочка исходников и рассмотрим необходимость тиражирования конкретных трюков.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вот типа того

 

...
if (cond1)
   goto end
....
if(cond2)
  goto end
....
:end
....
...

 

вот такой код, надо не трогая структуру не трогая то что под ... переписать чтобы не было goto, а логика работы осталась прежней...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вот типа того

 

...
if (cond1)
   goto end
....
if(cond2)
  goto end
....
:end
....
...

 

вот такой код, надо не трогая структуру не трогая то что под ... переписать чтобы не было goto, а логика работы осталась прежней...

Для чего "надо"?

А для чего вообще надо было писать это дерьмо с goto, потом для неведомо чего усугублять оставляя изначальное дерьмо но без goto следуя дебильному лозунгу "goto вредно"?

А написать сразу по человечески что мешало? Ну а способов, как оставить "похоже" множество. Самые безобидные:

static void dummy(void)
{
if (cond1)
   return;
....
if(cond2)
  return;
....
}

 

...

for(;; )
{
if (cond1)
   break;
....
if(cond2)
  break;
....
break;
}

 

 

Из серии наворотить дальше, наряду с Вашим любимым и "незаменимым" while{}do(0)

можно писать чего угодно, да хоть switch(0){}

 

Только нафига :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Надо бывает много для чего, ну и чем for(;;) {break} или switch(0){} лучше while{}do(0), ну кроме того что вы его лично не любите?

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Надо бывает много для чего, ну и чем for(;;) {break} или switch(0){} лучше while{}do(0), ну кроме того что вы его лично не любите?

Не буди лихо, пока оно тихо :crying:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...