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

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

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

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

Не знаю, что должна показать эта ссылка, у меня недостаточно прав для её просмотра. И не знаю, что это за айпишник в ссылке, он не мой.

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

 

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

Если бы её подтягивали из C++, она бы и работала как в C++ - означала бы, что функция не принимает аргументов. Нет?

 

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

Объявление функции с пустыми скобками - это не прототип по определению, но всё ещё допустимая стандартом конструкция.

 

Из черновика c89:

The empty list in a function declarator that is not part of a function definition specifies that no information about the number or types of the parameters is supplied.

 

Из черновика c11:

The empty list in a function declarator that is not part of a definition of that function specifies that no information about the number or types of the parameters is supplied.

 

Удивился. Проверил.

ругается:

Error[Pa045]: function "dummy" has no prototype

Это если включить "require prototypes".

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


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

Дык ради чего весь сыр-бор? Прочитать volatile-переменную. Вот просто не читали (если заглянуть в ассемблерный листинг).

Я вот ни разу с 80x годов таких "компиляторов" не встречал, хотя, конечно, в те годы компиляторы багами изобиловали :(. Ну и кроме всего прочего, как видно из приведенного выше примера, если вдруг компилятор решил не читать переменную, то заставить его "простыми" и "понятными" методами не получится в принципе. Ну разве только отключение оптимизации начисто, да и то это не надежно. Остается только считывание в другую глобальную volatile переменную. Что есть извращение.

Но на самом деле все работает, как предписано и без всяких уродливых мер.

 

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

Утомили, глупость в том, что function(); это ВООБЩЕ НЕ СИ. И в достандартные времена в неуоторых НЕ стандартных реализациях позволял так через ануc ОТКЛЮЧАТЬ контроль за аргуметами вообше, но никак НЕ передавать любое количество аргуметов. В Си вообше нельзя передать "любое" функции с переменным числом аргументов, ибо есть совершенно обьективное ограничение - минимум один должен быть.

Если бы её подтягивали из C++, она бы и работала как в C++ - означала бы, что функция не принимает аргументов. Нет?

Подтягивали наличие прототипов, а не делали из Си С++, но в том-то и дело, что до введения стандарта, делали это как попало.

Это если включить "require prototypes".

Да? А если ВЫКЛЮЧЕНО, то как тогда быть с СОБЛЮДЕНИМ Стандарта требующего наличие прототипов?

Это не говоря уже том, что СУТЬ В ТОМ что дивная дефиниция function(); игнорируется, повторяю - ИГНОРИРУЕТСЯ компилятором, и НЕ, как Вы вбили себе в голову, НЕ являтся прототипом функции с любым количеством аргументов. И эту, как Вы теперь пытаесь выкручиваться, "допустмую стандартом" неведомо для чего конструкцию, тот же GCC принимает за вызов функции и ругается на этот "прототип", что он не имеет прототипа :). Ах, да, тоже можно отключить требование соблюдать стандарт и использовать прототипы.

Ну не надо принимать наличие в Си мночисленых заплаток и костылей с помощью которых стараются обеспечить компиляцию всяких разных исходников писанных неведомо когда и неведомо кем, за НОРМУ.

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


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

Утомили, глупость в том, что function(); это ВООБЩЕ НЕ СИ. И в достандартные времена в неуоторых НЕ стандартных реализациях позволял так через ануc ОТКЛЮЧАТЬ контроль за аргуметами вообше, но никак НЕ передавать любое количество аргуметов. В Си вообше нельзя передать "любое" функции с переменным числом аргументов, ибо есть совершенно обьективное ограничение - минимум один должен быть.

Такой синтаксис до сих пор разрешается стандартом, значит это си.

В си есть возможность ПЕРЕДАВАТЬ функции любое число аргументов. Как и зачем их ПРИНИМАТЬ в функции (не обязательно написанной на си, к слову) - совсем другой вопрос.

 

Да? А если ВЫКЛЮЧЕНО, то как тогда быть с СОБЛЮДЕНИМ Стандарта требующего наличие прототипов?

Ну покажите уж, где это он строго требует?

 

Это не говоря уже том, что СУТЬ В ТОМ что дивная дефиниция function(); игнорируется, повторяю - ИГНОРИРУЕТСЯ компилятором, а не в том, что она как Вы вбили себе в голову,

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

 

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

Прототипы я вообще не упоминал до прошлого сообщения.

 

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

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

 

Ну не надо принимать наличие в Си мночисленых заплаток и костылей с помощью которых стараются обеспечить компиляцию всяких разных исходников писанных неведомо когда и неведомо кем, за НОРМУ.

А где я говорил, что считаю эти костыли чем-то хорошим? Оно просто есть, и я ничего с этим поделать не могу.

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


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

Прототипы я вообще не упоминал до прошлого сообщения.

Из того, что Вы не написали ни разу слово "прототип", теперь вдруг следует понимать то что Вы тут, оказыватся, рассказываете о чем-то другом?

Очень хотелось-бы тогда узнать о чем? А то стало совсем нереальным понять к чему вообще тогда относится Ваше ставшее теперь совершенно загадочным утверждение с которого все и началось:

int function();

и

int function(void);

...

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

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

И чем, тогда по Вашему являются эти самые int function(); и int function(void);

если не прототипами?

 

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


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

Из того, что Вы не написали ни разу слово "прототип", теперь вдруг следует понимать то что Вы тут, оказыватся, рассказываете о чем-то другом?

Очень хотелось-бы тогда узнать о чем? А то стало совсем нереальным понять к чему вообще тогда относится Ваше ставшее теперь совершенно загадочным утверждение с которого все и началось:

 

И чем, тогда по Вашему являются эти самые int function(); и int function(void);

если не прототипами?

Объявлениями (declaration) функций. Вторая из них заодно и прототип, первая - нет.

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


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

Такие теледвижения свидетельствуют только о незнании и неуверености

Такие телодвижения свидетельствуют об опыте работы в команде....

 

С меня если я напишу несколько лишних строчек, которые выкинет компилятор, при этом сделав правильный код (я кстати не говорил об отмене volatile я говорил лишь о том что явно делаю чтение) не убудет. А вот если мой коллега, чуть менее опытный или чуть более уставший занимаясь поиском непонятной ошибки потратить на разборку того что происходит на лишних 30 секунд меньше для проекта станет лучше.

 

Не понимаю людей которые экономят скобки, которые вместо явного указания условия пишут какие-то сокращенные сублимации и делают подобные штуки которые типа сокращают число ударов по кнопкам.

 

Мы все кричим про быдлокод считая что мы его не делаем, а вы уверены что его не наделает ваш коллега? Кто-то же его делает, значит попасть на такого человека ненулевая вероятность. И я считаю принять меры которые позволят коду это переварить - стоящее дело.

 

Следуя вашей тактике то и асершины в коде - это баловство и бла бла бла....

 

Вот кстати зачем вводили воид в скобках, для явного отличия прототипа от вызова:) для тех кто делает все не по уставу%)

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


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

Такие телодвижения свидетельствуют об опыте работы в команде....

Я только за простой и понятный код, чтобы "любая бабушка поняла". Но ведь где-то надо остановиться, и тут возможны варианты :rolleyes:

На мой вкус я бы приписал комментарий "для чайников":

(void)volatile_var; // read variable and discard result

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


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

Лучше команду подтягивать под свой гениальный уровень, чем опускаться до уровня быдлокоманды. :rolleyes: Я за перфекционизмъ.

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


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

Объявлениями (declaration) функций. Вторая из них заодно и прототип, первая - нет.

Черт! Вот они правильные слова. Действительно за использованием прототипов я начисто забыл, что раньше по совершенно объективной необходимости знать, что возвращает функция, если она возвращает не int по умолчанию, надо было это как-то указывать. Так-что int function(); действительно не протип, а декларация возвращемемого значения.

 

С меня если я напишу несколько лишних строчек, которые выкинет компилятор, при этом сделав правильный код...

Так в том-то и проблема, приведенного Вами примера, что все Ваши "лишние строчки", НИКАК НЕ СПОДВИГЛИ компилятор слелать "правильный код". Что я и нагляднейшим образм показал на компиляции Вашего примера.

А вот если мой коллега, чуть менее опытный....

А что должен подумать я, чуть более опытный, читая эту билеберду в поиске ошибки? Я ведь буду тратить время на поиск смысла, а что хотел сказать автор этим кодом? Может он хотел что-то сделать, но ошибся? B главное все признаки на это указывают - что-то написано, но это ничего не делает полезного? Лучше напишите для своего коллеги не понимающего азы языка, комментарий! Он хоть чему-то научится, вместо того, что бы "научится" тиражировать эту бесполезную муть.

Вот кстати зачем вводили воид в скобках, для явного отличия прототипа от вызова:) для тех кто делает все не по уставу%)

Читайте выше НЕ для этого. Для отличия от декларирования возвращаемого функцией значения. Которое, теперь сдедует признать, было сделано изначально через анус :(. Логичнее было что-нибудь в общем стиле:

extern int function();

хотя и так "по правильному" можно писать, но проблема в том, что можно и без extern :(, что и создает путаницу в отличие от декларирования, например, переменных.

 

На мой вкус я бы приписал комментарий "для чайников":

(void)volatile_var; // read variable and discard result

Именно так - c комментарием для незнающих языка, НО только (void) категорически лишний. Он никак не способствует чтению и только приносит вред МАСКИРУЯ выброс компилятором чтения, если вдруг по ошибке переменная окажется не volatile.

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


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

только (void) категорически лишний. Он никак не способствует чтению и только приносит вред МАСКИРУЯ выброс компилятором чтения, если вдруг по ошибке переменная окажется не volatile.

Ну это дело вкуса, как и while (1). Можете спорить до посинения, но я никогда не соглашусь, что while (1) - это какое-то вселенское зло, то же самое и (void) :biggrin:

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


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

Ну это дело вкуса...

Я более, чем прямо написал почему он ВРЕДНЫЙ, и это совершенно НЕ дело вкуса. Что не понятно-то?

 

но я никогда не соглашусь, что while (1) - это какое-то вселенское зло

1) Это не вселенское зло.

2) Просто "привычный" мусор :(.

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


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

А что должен подумать я, чуть более опытный, читая эту билеберду в поиске ошибки?

ну, ну.... чуть более опытный не будет спорить до посинения, не слушая аргументы других людей....

 

 

 

итайте выше НЕ для этого. Для отличия от декларирования возвращаемого функцией значения. Которое, теперь сдедует признать, было сделано изначально через анус sad.gif. Логичнее было что-нибудь в общем стиле:

extern int function();

хотя и так "по правильному" можно писать, но проблема в том, что можно и без extern sad.gif, что и создает путаницу в отличие от декларирования, например, переменных.

снизойдите объяснить для чуть менее опытного что значит сия алегория? я как то по глупости думал

 

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

что есть

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

 

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


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

ну, ну.... чуть более опытный не будет спорить до посинения, не слушая аргументы других людей....

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

 

 

 

 

снизойдите объяснить для чуть менее опытного что значит сия алегория?

Все уже предельно ясно бвло написано в первом абзаце:

Черт! Вот они правильные слова. Действительно за использованием прототипов я начисто забыл, что раньше по совершенно объективной необходимости знать, что возвращает функция, если она возвращает не int по умолчанию, надо было это как-то указывать. Так-что int function(); действительно не протип, а декларация возвращемемого значения.

Что конкретно не понятно? Что существует декларация функции, которая хоть де-факто отмерла с появлением прототипа функции, но все-же требуется необходимость их отличать друг от друга и от определения функции?

 

 

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


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

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

только не были понятыми, ну да ладно....

 

Что конкретно не понятно?

было непонятно

прототип

декларация

определение

у меня 2 из них как бы одно, примерчик бы с текстом и указанием где кто из них кто....

 

 

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


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

только не были понятыми, ну да ладно....

Меня можете не понимать, но то, что Вам сказал компилятор понимать просто ОБЯЗАНЫ. А компилятор Вам сказал, что Ваши пляски с бубном ему фиолетовы и он их выбросил и переменную читать не стал, а что делать при простом упоминании volatile переменной ему, напротив, совершенно понятно.

 

прототип

декларация

... как бы одно,

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

Так-что прототип это декларация, но декларация это не протототип :)

примерчик бы с текстом и указанием где кто из них кто....

Дык, те самые две неоднократно упоминаемые строчки.

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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