|
|
  |
Косяк у Кейла, Препроцессор не следит за скобками |
|
|
|
Aug 29 2015, 16:57
|
.
     
Группа: Участник
Сообщений: 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
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Aug 29 2015, 17:29
|

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

|
QUOTE (GetSmart @ Aug 29 2015, 19:57)  Для zltigo: Качество кода ремарками не измеряется. Не вводите в заблуждение читателей, называя их ругательством компилятора. Поскольку я многие годы много вычитываю чужого кода, то могу утверждать, что еще как измеряется. Писатели не могущие четко выражать свои мысли компилятору, в результате чего компилятору приходится принимать какое-либо неоднозначное решение, получают такой-же нечеткий результат.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 29 2015, 17:39
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(zltigo @ Aug 29 2015, 21:29)  Писатели не могущие четко выражать свои мысли компилятору получают такой-же нечеткий результат. На while (const) ? Критикуйте конструктивней и точечней. Необоснованность ругательств компиляторов нужно разбирать в каждом конкретном случае. Компиляторописатели тоже лажают. Встречал граблю когда в конструкции if (0) стоит метка и вне if-а, ниже по коду, стоит на неё переход. Виновен компиляторописатель. Необычный код, но по стандарту ошибки нет.
Сообщение отредактировал GetSmart - Aug 29 2015, 17:58
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Aug 29 2015, 17:39
|

Гуру
     
Группа: Свой
Сообщений: 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=1361373QUOTE А зачем писать на самом деле НЕПОНЯТНОЕ, хотя и "привычная", но бессмысленная конструкция while(1), на которую хоть и некоторые компиляторы, но ругатся (и правильно делают), вместо канонического варианта - цикл БЕЗ проверки условий, прямо для такого случая предусмотренного? Зачем? ? А по поводу "возникновения" - уже отвечал: http://electronix.ru/forum/index.php?showt...t&p=1361241
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 29 2015, 17:47
|

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Aug 29 2015, 18:07
|

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

|
QUOTE (ViKo @ Aug 29 2015, 21:05)  На то есть #include <stdbool.h> А смысл - лично для меня, эстета.  "Истина" круче "единицы". Повторяю - ЕСЛИ ЕСТЬ, а есть только начиная, помнится, с C99, а если нет, то...
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 29 2015, 18:14
|

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

|
Цитата(zltigo @ Aug 29 2015, 21:07)  Повторяю - ЕСЛИ ЕСТЬ, а есть только начиная, помнится, с C99, а если нет, то... Напомните, сколько лет прошло с 1999 года? Что ж цепляться за старое? В том, чем я пользуюсь, есть. Прикажете забить (забыть)?
|
|
|
|
|
Aug 29 2015, 18:14
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(zltigo @ Aug 29 2015, 21:47)  Warning на constant expression это не единственный warning выдаваемый компиляторами из тех, ктороые нерадивые любят давить. Список компиляторов в студию. И текст исходника. Экономьте время собеседников на уточнения. Цитата Для do и while зато упоминаются expression. А constant expression частный случай expression. Сможете опровергнуть?
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Aug 29 2015, 18:18
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(zltigo @ Aug 29 2015, 20:39)  Зачем? Потому что это нормальная языковая конструкция. Специально посмотрел: использую оба варианта, но чаще while(1). Объясняется это очень просто - в старые времена компиляторы под ARM отвратительно компилировали циклы for, из-за чего повсеместно использовал do-while. Потом пришлось специально заставлять себя писать for, потому как последний для обычных циклов нагляднее. Но для бесконечного цикла разницы не делаю.
|
|
|
|
|
Aug 29 2015, 18:39
|

Гуру
     
Группа: Свой
Сообщений: 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. Какого черта - вопрос не ко мне, а к "программистам" тупо по умолчанию собравших. А там действительно чистый говнокод, который-бы сто лет не читал-бы, но он идет, в соответствии с новейшими тенденциями, ВМЕСТО документации  . 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
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|