Jump to content

    

Косяк у Кейла

Recommended Posts

zltigo
Вы из тех, кто считает себя слишком опытным, чтоб допустить свою неправоту, да?

Своим постом "Гуглите, читайте, пробуйте". Вы не смогли не то, что "доказать", а даже хоть как-то попытаться обосновать "правоту" своего утверждения:

int function();

и

int function(void);

это в си совсем не одно и то же

...

Первый вариант позволяет вызвать функцию с любым числом аргументов.

...сейчас устаревшее, но из стандарта не удалённое.

Мне только оставалось согласиться c Вашим провалом, что я и сделал. Так что "дискуссия" с Вами завершена.

Share this post


Link to post
Share on other sites

Golikov

У zltigo много безапелляционных утверждений, обычно строящихся по схеме "никто не может быть прав, если я думаю иначе", однако в этом конкретном случае хотелось бы больше деталей.

Стандарт языка С достоверный с ИСО сайта фиг достанешь, он там за деньги, а что находиться нахаляву - перепечатки и трактования. Косвенно я нашел 2 вещи, что вроде бы в С89 было function() - объявление функции возвращающей int и принимающей любое число параметров, но там и нельзя было написать function(void). А с С99 вроде бы когда появилось function(void) уже список переменных параметров задать даже через function(...) нельзя, нужен хотя бы 1 формальный параметр function(double p, ...)

 

Но это перепечатки и объяснения друг другу, а вот реально в документе АНСИ я что-то найти правды не смог, даже подлинного документа не смог найти....

 

Кто-то внесет ясность? желательно со ссылкой на ревизию стандарта.

Share this post


Link to post
Share on other sites

zltigo
Стандарт языка С достоверный с ИСО сайта фиг достанешь...

Это собственно незачем и делать. Комитет, кроме собственно стандарта предназначенного для разработчиков компиляторов, выпустил так-же "Rationale" , AKA руководство для пользователей.

то вроде бы в С89 было function() - объявление функции возвращающей int и принимающей любое число параметров, но там и нельзя было написать function(void).

Написание function(void) именно тогда и было введено, и именно в противовес function(), которое трактовалось иногда в отсутствие стандартов, производителями компиляторов подтянувших фичи C++, и как то, что об агрументах ничего неизвесто и позволяло таким образом тупо посылать компилятор нафиг с его контролем. То есть получался не прототип функции, а отключалка контроля.

 

C появлением первого-же Стандарта языка, появились и прототипы, и соответственно официальный способ описать прототип функции без параметров - function(void). А не кем-то, когда-то используемый на свое усмотрение для этой цели function(). А function(); является соответственно ошибочным прототипом, на который компитяторы ругаются по умолчанию предупреждением (для обеспечения совместимости с разнообразными достандартными исходниками), как по той-же причине ругаются предупреждением, а не ошибкой, на отсутствие прототипов, котрых так-же не было у K&R.

Share this post


Link to post
Share on other sites

zltigo
Молодец, нашёл.

Повторяю:

Мне только оставалось согласиться c Вашим провалом, что я и сделал. Так что "дискуссия" с Вами завершена.

 

 

Share this post


Link to post
Share on other sites

GetSmart

Как откусить яблоко. Сериал. Многоходовка.

 

IAR на прототип с пустыми скобками не ругается. И правильно делает. Если считает их однозначно пустым списком. А бэк совместимость логичнее задавать опцией компиляции.

 

По поводу пустых скобок в for() ошибся, т.к. никогда его не использую, он пишется for(;;).

 

function(void)

Это криво. Неявный int тоже криво.

 

void, как и другие стандартные типы, при встрече в коде является началом объявления типа объекта. В пустом списке параметров нет ни одного объекта.

Edited by GetSmart

Share this post


Link to post
Share on other sites

den_po
Мне только оставалось согласиться c Вашим провалом, что я и сделал.

Ну то есть что вы сначала оспаривали мои слова, а потом с ними согласились, это мой провал? Ну ок, "гуру" меня размазал.

 

Это криво. Неявный int тоже криво.

Неявное объявление функции при первом использовании - вот, наверное, самое отвратительное в сях.

Edited by den_po

Share this post


Link to post
Share on other sites

Petka
Ну то есть что вы сначала оспаривали мои слова, а потом с ними согласились, это мой провал? Ну ок, "гуру" меня размазал.

...

Не утруждайтесь. Это такой стиль. Или как принято говорить: двойные стандарты. Когда я в этой теме просил "гуру" дать ссылки на подтверждение своих голословных заявлений (http://electronix.ru/forum/index.php?s=&showtopic=130098&view=findpost&p=1361284) , то "гуру" не соизволил ничего ответить по существу дела. Вместо этого "гуру" зачем-то приплёл не относящийся к делу пустой "for(;;)" прекрасно понимая что это совсем не эквивалент do-while-zero конструкции. Забавно получилось, что "гуру" вместо признания своей ошибки начал загонять себя ещё глубже, ссылаясь на "творца Си" Денниса Ритчи. Однако, "гуру" забыл что в сеть попали исходники самых первых трансляторов. По исходникам становится очевидно, что конструкция for вообще отсутствовала в первом компиляторе а для циклов "творец" использовал while.

 

P.S. Будьте добрее. Всем хороших выходных.

Share this post


Link to post
Share on other sites

zltigo
Ну то есть что вы сначала оспаривали мои слова, а потом с ними согласились

С Вашей глупостью

http://electronix.ru/forum/index.php?showt...t&p=1371217

согласиться не могу. То, что Вы сейчас пытаетесь выкручиваться делая вид, что якобы писали о чем-то другом, тоже глупо :(.

Share this post


Link to post
Share on other sites

Golikov
C появлением первого-же Стандарта языка, появились и прототипы, и соответственно официальный способ описать прототип функции без параметров - function(void).

мне кажется вы ошибаетесь....

 

даже вот человек пишет

void, как и другие стандартные типы, при встрече в коде является началом объявления типа объекта. В пустом списке параметров нет ни одного объекта.

именно это и была проблема что void это как бы тип, и его только потом расширили до пустоты то есть function(void) - это такая специальная синтетическая конструкция, и появилась она не сразу, я видел это в изменениях, то есть в каких-то ново введениях.

 

 

Share this post


Link to post
Share on other sites

zltigo
прекрасно понимая что это совсем не эквивалент do-while-zero конструкции

Вам просто следовало-бы наконец понять, что "do-while-zero" является сама по себе ненужным трюком и еще в каких-то "эквивалентах" не нуждается.

 

 

именно это и была проблема что void это как бы тип, и его только потом расширили...

Давайте начнем с того, что его не когда-то "потом расширили", а именно сразу в САМОМ ПЕРВОМ СТАНДАРТЕ языка Си, как только он в Си а не в ++ появился.

До первого стандарта было только неформальное описание языка K&R и ничего более.

До первого стандарта не было вообще прототипов функций, как и void. Как только появились стандартизированные прототипы функций, появилися прототип

function(void); прототипа function() не существовало ни у K&R ввиду отсутствия прототипов как таковых, ни в стандатах, где забит уже function(void).

Так-что прототип function() это калька писателей компиляторов в период бесстандартности, когда подтягивали безусловно эту безусловно полезнейнейшую фичу из C++.

А что Вы скажете о таком использовании void:

(void)argument;

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.