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

На тему нововведений хочется прояснить ещё один любопытный нюанс. В интернете написано, что до стандарта 89 года пустой список аргументов функций объявлялся пустыми скобками. Что и естественно, и просто в реализации компилятора. Т.к. встреча ключевого слова void (без описываемого нововведения) обозначает объявление типа. Внутри же списка аргументов из-за void появляется некоторая нестыковка. В чём был смысл нововведения? Может есть некие аналогии или другие принципы? Или боязнь пустых скобок. Хотя в for() их таки притянули за уши. Может кто-то интересовался историей эволюции или читал что-то похожее на мемуары.

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

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


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

На тему нововведений хочется прояснить ещё один любопытный нюанс. В интернете написано, что до стандарта 89 года пустой список аргументов функций объявлялся пустыми скобками.

А что стали обозначать пустые скобки со стандарта 89 года, там написано?

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


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

Думаю, zltigo сказал бы: "бессмысленность".

 

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

 

----

 

Может быть мой вопрос как-то пересекается с прототипированием функций. В каких-то источниках акцентируются прототипы. Но ясная причина отказа от пустых скобок не обозначена.

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

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


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

думаю дань всяким чекерам, чтобы явно указать что вы не забыли параметры, а их реально не должно быть. Или чтобы отличать вызов функции от ее объявления более наглядно.... или чтобы разработчик мог явно указать что точно ничего вызывать не надо, а он ничего не забыл... резюме - для повышения читаемости и понятности кода...

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


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

А что стали обозначать пустые скобки со стандарта 89 года, там написано?

Видимо некорректно и неточно написал, скопипастив источник интернета. Void навязывается только в прототипах функций. Но из-за этого он допускается и во всех остальных местах объявления заголовков функций. И эта полумера/полутребование кривое вдвойне. Либо что-то важное ещё не озвучено.

 

 

Golikov A.

Невозможно забыть/опечататься в определении функции с её телом, а так же при её вызове, т.к. у компилятора есть вся информация для выявления ошибки. В прототипе тоже сомнительно.

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

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


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

Невозможно забыть/опечататься в определении функции с её телом,

Это Вы за себя говорите, или за всяких "кодеров" (не понимаюших правил хрошего тона в языке но наплодивших и продлжкющих плодить всякое) тоже?

 

Вот что это:

 

smart();

 

1) Вызов функции;

2) Опредеоение функции;

3) Макрос;

 

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

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

Посему ныне требуемое определение функции:

void function(void);

вполне логично,

void function();

нелогично, а

function();

использовать нельзя, по тому, что это на самом деле, благодаря :( изначально заложенной глупости, совсем другая функция:

int function(void);

зато, блин, оталась возможноcть писать:

function(void);

 

Проблема в том, что изменения ( изменения, а не дополнения ) в стандарте страдают полумерами :( - вводя тот-же void, надо было запрешать и по умолчанию возвращаемое int. Но ведь сколько "кодеров" такое УЖЕ размножили в мириадах строк, как и дикое while(1) :(. Вот и тянут :( :( :(

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


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

В С99 неявный возвращаемый int убрали. А вы все старье обсуждаете.

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


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

нелогично, а

function();

использовать нельзя, по тому, что это на самом деле, благодаря :( изначально заложенной глупости, совсем другая функция:

int function(void);

int function();

и

int function(void);

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

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


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

int function();

и

int function(void);

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

Да ну! Не дайте помереть невежей - поведайте в чем-же это было раньше отличие.

 

В С99 неявный возвращаемый int убрали. А вы все старье обсуждаете.

Убрали убрали так, что какой-нибудь GCC максимум предупреждение выдает, да и то подавлнное.

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


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

Да ну! Не дайте помереть невежей - поведайте в чем-же это было раньше отличие.

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

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


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

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

В какого года стандарте это определено?

 

int function();

На этот вариант 4-ый Кейл выдаёт варнинг - "deprecated". Ругается даже на static-прототип без void в пустом списке аргументов.

 

zltigo

void в месте возвращаемого функцией значения к делу отношения не имеет. Там void ни с чем не конфликтует. Странно только, что неявным там был int, а не отсутствие возвращаемого значения (aka void в будущем).

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

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


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

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

Разумеется нет. И вообще "любое" в Cи вообще не сущесвует, ибо даже funсtion(...); , если компилятор и не выдаст ошибку, как минимум бессмысленна, посему - funсtion( param, .... );

То есть не менее одного.

 

 

 

 

void в месте возвращаемого функцией значения к делу отношения не имеет.

Имеет, как пример полностью однозначного определения функции и когда убрали разрешенную неопределенность с возвращаемым значением, стало логичным убрать ее и в передаваемым значением.

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


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

В какого года стандарте это определено?

С того же 89 оно упоминается. Тогда оно было "устаревающим", сейчас устаревшее, но из стандарта не удалённое.

 

Разумеется нет. И вообще "любое" в Cи вообще не сущесвует, ибо даже funktion(...); , если компилятор и не выдаст ошибку, как минимум бессмысленна, посему - funktion( param, .... );

То есть не менее одного.

Гуглите, читайте, пробуйте.

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


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

Понятно. Просто сбрехали.

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

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


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

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

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

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

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

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

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

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

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

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