Jump to content

    

Косяк у Кейла

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

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

int function();

и

int function(void);

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

...

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

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

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

Share this post


Link to post
Share on other sites

Упёртый. Ясно. А ведь убедиться, что я прав, так легко...

Share this post


Link to post
Share on other sites

У 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
Стандарт языка С достоверный с ИСО сайта фиг достанешь...

Это собственно незачем и делать. Комитет, кроме собственно стандарта предназначенного для разработчиков компиляторов, выпустил так-же "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
Молодец, нашёл.

Повторяю:

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

 

 

Share this post


Link to post
Share on other sites
Как то вяло все происходит

Понять бы, вообще, суть текущей переписки. :rolleyes:

Share this post


Link to post
Share on other sites

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

 

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

 

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

 

function(void)

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

 

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

Edited by GetSmart

Share this post


Link to post
Share on other sites
Мне только оставалось согласиться c Вашим провалом, что я и сделал.

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

 

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

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

Edited by den_po

Share this post


Link to post
Share on other sites
Ну то есть что вы сначала оспаривали мои слова, а потом с ними согласились, это мой провал? Ну ок, "гуру" меня размазал.

...

Не утруждайтесь. Это такой стиль. Или как принято говорить: двойные стандарты. Когда я в этой теме просил "гуру" дать ссылки на подтверждение своих голословных заявлений (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
Ну то есть что вы сначала оспаривали мои слова, а потом с ними согласились

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

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

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

Share this post


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

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

 

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

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

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

 

 

Share this post


Link to post
Share on other sites
прекрасно понимая что это совсем не эквивалент 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

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this