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

 
 
18 страниц V  « < 4 5 6 7 8 > »   
Reply to this topicStart new topic
> Косяк у Кейла, Препроцессор не следит за скобками
GetSmart
сообщение Aug 29 2015, 16:57
Сообщение #76


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Для zltigo:
Качество кода ремарками не измеряется. Не вводите в заблуждение читателей, называя их ругательством компилятора.

Например:
if (1) ... до препроцессора могло быть if (Expr) ..., где Expr определялось дефайном. Вся конструкция вызывала бы опциональную инициализацию периферии, например. В отличие от #if допускает даже рунтайм-условие (вроде Fclk > 100). И безусловно должно допускать простейшую константу или выражение, вычисляемое на этапе компиляции. Неполиткорректно называть это ужасным. Ну а что позволено if-у, то юпитеру while и подавно. ИМХО всё вполне читабельно.Так же ИМХО, должно вызывать ремарку компилятора, если условие известно на этапе компиляции.

Смысла в таких конструкциях более чем достаточно. Хватит вопить про бессмысленность и всякий криминал. Даже просто if (0 или 1) (это без вмешательства препроцессора) могло быть промежуточной (но 100% рабочей) версией кода, расчитанной на изменение условия в дальнейшем. Вобщем код опционален и этот блок можно включить или выключить по необозначенному явно условию. Смысл в константах есть. Нарушений стандарта нет.

Сообщение отредактировал GetSmart - Aug 29 2015, 17:31


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 29 2015, 17:12
Сообщение #77


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(zltigo @ Aug 29 2015, 19:20) *
Что это вообще - "пока один"? Ну? Тогда-уж агитировали-бы за while( 1 == 1 ) по любому бессмысленная проверка неизменного условия, но хоть какой-то смысл типа "понятнее" можно было притянуть.

1 - это nonzero constant, как раз то, что возникает на пустом месте в for(;;)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 29 2015, 17:29
Сообщение #78


Гуру
******

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



QUOTE (GetSmart @ Aug 29 2015, 19:57) *
Для zltigo:
Качество кода ремарками не измеряется. Не вводите в заблуждение читателей, называя их ругательством компилятора.

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
ViKo
сообщение Aug 29 2015, 17:37
Сообщение #79


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

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



Цитата(Сергей Борщ @ Aug 29 2015, 17:55) *
На самом деле предупреждает не зря. Одно дело 1 << 7 + 16, а сам неоднократно накалывался на word = byte1 << 8 + byte2, хотя точно знаю, что приоритет у сложения выше. И только благодаря этому предупреждению не тратил время на поиски очевидной, но тем не менее пролетающей между глаз ошибки.

Согласен, здесь приоритеты не очевидны. Может, действительно, не жалеть скобок...
Надо было сделать приоритеты этих операторов равными.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Aug 29 2015, 17:39
Сообщение #80


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(zltigo @ Aug 29 2015, 21:29) *
Писатели не могущие четко выражать свои мысли компилятору получают такой-же нечеткий результат.

На while (const) ?

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

Компиляторописатели тоже лажают. Встречал граблю когда в конструкции if (0) стоит метка и вне if-а, ниже по коду, стоит на неё переход. Виновен компиляторописатель. Необычный код, но по стандарту ошибки нет.

Сообщение отредактировал GetSmart - Aug 29 2015, 17:58


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 29 2015, 17:39
Сообщение #81


Гуру
******

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



QUOTE (aaarrr @ Aug 29 2015, 20:12) *
1 - это nonzero constant, как раз то, что возникает на пустом месте в for(;;)

А где все-же ответ на вопрос http://electronix.ru/forum/index.php?showt...t&p=1361373
QUOTE
А зачем писать на самом деле НЕПОНЯТНОЕ, хотя и "привычная", но бессмысленная конструкция while(1), на которую хоть и некоторые компиляторы, но ругатся (и правильно делают), вместо канонического варианта - цикл БЕЗ проверки условий, прямо для такого случая предусмотренного? Зачем?

?
А по поводу "возникновения" - уже отвечал: http://electronix.ru/forum/index.php?showt...t&p=1361241


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
ViKo
сообщение Aug 29 2015, 17:40
Сообщение #82


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

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



Кстати, я никогда не пишу #if (0) или #if (1), а только #if (true), #if (false)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 29 2015, 17:47
Сообщение #83


Гуру
******

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



QUOTE (GetSmart @ Aug 29 2015, 20:39) *
Критикуйте конструктивней и точечней.

Читайте внимательнее и не фантазируйте. Warning на constant expression это не единственный warning выдаваемый компиляторами из тех, ктороые нерадивые любят давить.

QUOTE (ViKo @ Aug 29 2015, 20:40) *
Кстати, я никогда не пишу #if (0) или #if (1), а только #if (true), #if (false)

А смысл? Тем более для препроцессора, для которого это никаким боком не ключевые слова, как впрочем и для произвольного (не C11? C99?) Си компилятора. Только в свежих стандартах true и false определены и в том числе для препроцесора.

Зато какие прелесные эффекты будут с каким-нибудь GCC препроцессором, который молча без всяких предупреждений подсунет вместо недефинированого true нолик.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
ViKo
сообщение Aug 29 2015, 18:05
Сообщение #84


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

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



Цитата(zltigo @ Aug 29 2015, 20:47) *
А смысл? Тем более для препроцессора, для которого это никаким боком не ключевые слова, как впрочем и для произвольного (не C11? C99?) Си компилятора. Только в свежих стандартах true и false определены и в том числе для препроцесора.

Зато какие прелесные эффекты будут с каким-нибудь GCC препроцессором, который молча без всяких предупреждений подсунет вместо недефинированого true нолик.

На то есть #include <stdbool.h> А смысл - лично для меня, эстета. rolleyes.gif "Истина" круче "единицы".
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 29 2015, 18:07
Сообщение #85


Гуру
******

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



QUOTE (ViKo @ Aug 29 2015, 21:05) *
На то есть #include <stdbool.h> А смысл - лично для меня, эстета. rolleyes.gif "Истина" круче "единицы".

Повторяю - ЕСЛИ ЕСТЬ, а есть только начиная, помнится, с C99, а если нет, то...


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
ViKo
сообщение Aug 29 2015, 18:14
Сообщение #86


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

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



Цитата(zltigo @ Aug 29 2015, 21:07) *
Повторяю - ЕСЛИ ЕСТЬ, а есть только начиная, помнится, с C99, а если нет, то...

Напомните, сколько лет прошло с 1999 года? Что ж цепляться за старое? В том, чем я пользуюсь, есть. Прикажете забить (забыть)?
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Aug 29 2015, 18:14
Сообщение #87


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(zltigo @ Aug 29 2015, 21:47) *
Warning на constant expression это не единственный warning выдаваемый компиляторами из тех, ктороые нерадивые любят давить.

Список компиляторов в студию. И текст исходника. Экономьте время собеседников на уточнения.

Цитата
Для do и while зато упоминаются expression. А constant expression частный случай expression.

Сможете опровергнуть?


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 29 2015, 18:18
Сообщение #88


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(zltigo @ Aug 29 2015, 20:39) *
А где все-же ответ на вопрос http://electronix.ru/forum/index.php?showt...t&p=1361373

Зачем? Потому что это нормальная языковая конструкция.

Специально посмотрел: использую оба варианта, но чаще while(1). Объясняется это очень просто - в старые времена
компиляторы под ARM отвратительно компилировали циклы for, из-за чего повсеместно использовал do-while.
Потом пришлось специально заставлять себя писать for, потому как последний для обычных циклов нагляднее.
Но для бесконечного цикла разницы не делаю.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 29 2015, 18:39
Сообщение #89


Гуру
******

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



QUOTE (ViKo @ Aug 29 2015, 21:14) *
Напомните, сколько лет прошло с 1999 года? Что ж цепляться за старое?

Абсолютно согласен, что использовать следует C99. Но жизнь, есть жизнь. Я вот до сих пор вынужден пользовать И компиляторы не поддерживающие C99. C99 просто нет. Есть и глупые варианты, например, пару месяцев назад начал рабтать с котроллерос с ядром BA22. Есть GCC toolchain весь из себя C99. Но весь говнокод идущий с контроллером компилируется не в С99. Какого черта - вопрос не ко мне, а к "программистам" тупо по умолчанию собравших. А там действительно чистый говнокод, который-бы сто лет не читал-бы, но он идет, в соответствии с новейшими тенденциями, ВМЕСТО документации sad.gif.


QUOTE (aaarrr @ Aug 29 2015, 21:18) *
Зачем? Потому что это нормальная языковая конструкция.

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




QUOTE (GetSmart @ Aug 29 2015, 21:14) *
Список компиляторов в студию

Не сочтите за труд ознакомится с ранее данным ответом на этот вопрос.


QUOTE (GetSmart @ Aug 29 2015, 21:14) *
Сможете опровергнуть?

Частные случаи на то и частные, что не всегда эквиваленты общим. По этой причне в стандарте эти понятия и РАЗДЕЛЕНЫ и constant expression в контесте while() НЕ упоминаются, в отличие, кстати, от for()

QUOTE (aaarrr @ Aug 29 2015, 21:18) *
Специально посмотрел: использую оба варианта, но чаще while(1). Объясняется это очень просто - в старые времена
компиляторы под ARM отвратительно компилировали циклы for, из-за чего повсеместно использовал do-while.

У меня еще для одного изделия на AM186CC еще живет BCC 3.1 за него, правда уже не уверен, но 2.0 для while( 1 ) генерил лишний код в цикле, в отличие от for( ; ; ).


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 29 2015, 18:44
Сообщение #90


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(zltigo @ Aug 29 2015, 21:39) *
В вопросе, по причине того, что такой "ответ" повторяется вместо мантры, был сразу и второй - почему на "нормальную" ругаются компиляторы? Их разработчики так-же, как и я "заблуждаются"?

Как Вы сами заметили, уже перестают. Времена меняются, язык тоже.
Go to the top of the page
 
+Quote Post

18 страниц V  « < 4 5 6 7 8 > » 
Reply to this topicStart new topic
4 чел. читают эту тему (гостей: 4, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 04:32
Рейтинг@Mail.ru


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