реклама на сайте
подробности

 
 
18 страниц V  « < 11 12 13 14 15 > »   
Reply to this topicStart new topic
> Косяк у Кейла, Препроцессор не следит за скобками
den_po
сообщение Oct 11 2015, 21:48
Сообщение #181


Частый гость
**

Группа: Участник
Сообщений: 139
Регистрация: 9-11-12
Из: Санкт-Петербург
Пользователь №: 74 315



QUOTE (zltigo @ Oct 11 2015, 20:28) *
С Вашей глупостью
http://electronix.ru/forum/index.php?showt...t&p=1371217
согласиться не могу. То, что Вы сейчас пытаетесь выкручиваться делая вид, что якобы писали о чем-то другом, тоже глупо sad.gif.

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

QUOTE (zltigo @ Oct 11 2015, 20:44) *
Так-что прототип function() это калька писателей компиляторов в период бесстандартности, когда подтягивали безусловно эту безусловно полезнейнейшую фичу из C++.

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

QUOTE (zltigo @ Oct 11 2015, 20:44) *
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.

QUOTE (zltigo @ Oct 11 2015, 23:38) *
Удивился. Проверил.
ругается:
Error[Pa045]: function "dummy" has no prototype

Это если включить "require prototypes".
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 11 2015, 22:15
Сообщение #182


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (scifi @ Oct 12 2015, 00:34) *
Дык ради чего весь сыр-бор? Прочитать volatile-переменную. Вот просто не читали (если заглянуть в ассемблерный листинг).

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

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

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

Подтягивали наличие прототипов, а не делали из Си С++, но в том-то и дело, что до введения стандарта, делали это как попало.
QUOTE
Это если включить "require prototypes".

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
den_po
сообщение Oct 11 2015, 23:08
Сообщение #183


Частый гость
**

Группа: Участник
Сообщений: 139
Регистрация: 9-11-12
Из: Санкт-Петербург
Пользователь №: 74 315



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

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

Цитата(zltigo @ Oct 12 2015, 02:15) *
Да? А если ВЫКЛЮЧЕНО, то как тогда быть с СОБЛЮДЕНИМ Стандарта требующего наличие прототипов?

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

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

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

Цитата(zltigo @ Oct 12 2015, 02:15) *
являтся прототипом функции с любым количеством аргументов.

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

Цитата(zltigo @ Oct 12 2015, 02:15) *
И эту, как Вы теперь пытаесь выкручиваться, "допустмую стандартом" неведомо для чего конструкцию, тот же GCC принимает за вызов функции и ругается на этот "прототип", что он не имеет прототипа sm.gif. Ах, да, тоже можно отключить требование соблюдать стандарт и использовать прототипы.

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

Цитата(zltigo @ Oct 12 2015, 02:15) *
Ну не надо принимать наличие в Си мночисленых заплаток и костылей с помощью которых стараются обеспечить компиляцию всяких разных исходников писанных неведомо когда и неведомо кем, за НОРМУ.

А где я говорил, что считаю эти костыли чем-то хорошим? Оно просто есть, и я ничего с этим поделать не могу.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 11 2015, 23:37
Сообщение #184


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (den_po @ Oct 12 2015, 02:08) *
Прототипы я вообще не упоминал до прошлого сообщения.

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

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
den_po
сообщение Oct 11 2015, 23:58
Сообщение #185


Частый гость
**

Группа: Участник
Сообщений: 139
Регистрация: 9-11-12
Из: Санкт-Петербург
Пользователь №: 74 315



Цитата(zltigo @ Oct 12 2015, 03:37) *
Из того, что Вы не написали ни разу слово "прототип", теперь вдруг следует понимать то что Вы тут, оказыватся, рассказываете о чем-то другом?
Очень хотелось-бы тогда узнать о чем? А то стало совсем нереальным понять к чему вообще тогда относится Ваше ставшее теперь совершенно загадочным утверждение с которого все и началось:

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

Объявлениями (declaration) функций. Вторая из них заодно и прототип, первая - нет.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Oct 12 2015, 07:08
Сообщение #186


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



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

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

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

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

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

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

Вот кстати зачем вводили воид в скобках, для явного отличия прототипа от вызоваsm.gif для тех кто делает все не по уставу%)
Go to the top of the page
 
+Quote Post
scifi
сообщение Oct 12 2015, 07:11
Сообщение #187


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Golikov A. @ Oct 12 2015, 09:58) *
Такие телодвижения свидетельствуют об опыте работы в команде....

Я только за простой и понятный код, чтобы "любая бабушка поняла". Но ведь где-то надо остановиться, и тут возможны варианты rolleyes.gif
На мой вкус я бы приписал комментарий "для чайников":
Код
(void)volatile_var; // read variable and discard result
Go to the top of the page
 
+Quote Post
ViKo
сообщение Oct 12 2015, 07:31
Сообщение #188


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Лучше команду подтягивать под свой гениальный уровень, чем опускаться до уровня быдлокоманды. rolleyes.gif Я за перфекционизмъ.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 12 2015, 07:57
Сообщение #189


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (den_po @ Oct 12 2015, 02:58) *
Объявлениями (declaration) функций. Вторая из них заодно и прототип, первая - нет.

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

QUOTE (Golikov A. @ Oct 12 2015, 10:08) *
С меня если я напишу несколько лишних строчек, которые выкинет компилятор, при этом сделав правильный код...

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

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

Читайте выше НЕ для этого. Для отличия от декларирования возвращаемого функцией значения. Которое, теперь сдедует признать, было сделано изначально через анус sad.gif. Логичнее было что-нибудь в общем стиле:
extern int function();
хотя и так "по правильному" можно писать, но проблема в том, что можно и без extern sad.gif, что и создает путаницу в отличие от декларирования, например, переменных.

QUOTE (scifi @ Oct 12 2015, 10:11) *
На мой вкус я бы приписал комментарий "для чайников":
CODE
(void)volatile_var; // read variable and discard result

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
scifi
сообщение Oct 12 2015, 08:58
Сообщение #190


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



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

Ну это дело вкуса, как и while (1). Можете спорить до посинения, но я никогда не соглашусь, что while (1) - это какое-то вселенское зло, то же самое и (void) biggrin.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 12 2015, 11:09
Сообщение #191


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (scifi @ Oct 12 2015, 11:58) *
Ну это дело вкуса...

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

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

1) Это не вселенское зло.
2) Просто "привычный" мусор sad.gif.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Oct 12 2015, 13:31
Сообщение #192


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



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

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



Цитата
итайте выше НЕ для этого. Для отличия от декларирования возвращаемого функцией значения. Которое, теперь сдедует признать, было сделано изначально через анус sad.gif. Логичнее было что-нибудь в общем стиле:
extern int function();
хотя и так "по правильному" можно писать, но проблема в том, что можно и без extern sad.gif, что и создает путаницу в отличие от декларирования, например, переменных.

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

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

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

Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 12 2015, 13:43
Сообщение #193


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (Golikov A. @ Oct 12 2015, 16:25) *
ну, ну.... чуть более опытный не будет спорить до посинения, не слушая аргументы других людей....

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




QUOTE (Golikov A. @ Oct 12 2015, 16:31) *
снизойдите объяснить для чуть менее опытного что значит сия алегория?

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

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



--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Oct 12 2015, 13:49
Сообщение #194


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



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

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

Цитата
Что конкретно не понятно?

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

Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 12 2015, 13:54
Сообщение #195


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (Golikov A. @ Oct 12 2015, 16:49) *
только не были понятыми, ну да ладно....

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

QUOTE (Golikov A. @ Oct 12 2015, 16:49) *
прототип
декларация
... как бы одно,

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

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

18 страниц V  « < 11 12 13 14 15 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 1st August 2025 - 18:46
Рейтинг@Mail.ru


Страница сгенерированна за 0.01505 секунд с 7
ELECTRONIX ©2004-2016