|
|
  |
Косяк у Кейла, Препроцессор не следит за скобками |
|
|
|
Aug 29 2015, 09:58
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(zltigo @ Aug 29 2015, 13:53)  Ошибку того, что программист получил не то, что он думал. Ибо компилятор получил в качестве инструкции БЕССМЫСЛЕННОЕ, хотя и однозначное выражение. Дальше у компилятора два варианта - решить, что это написал не программист а "Джамшут" и не пытаться от него чего-либо еще добиваться, либо таки сообщить о подозрительном выражении. Для определения "Джамшут"/программист у хороших компиляторов есть опция соответствующего warnig. Это уже не потенциальные, а реально НЕОБОСНОВАННЫЕ обвинения и опасения. Контраргументация ранее была изложена в достаточном объёме. ------ Предлагаю желающим обсудить другой криминал. Не запрещено ли всевышним использование пустых фигурных скобок. А так же точки с запятой после скобок. Или внутри скобок обязательно должна стоять хотя бы точка с запятой. Часто циклы ожидания какого-то события делают пустыми, а в конце {};
Сообщение отредактировал GetSmart - Aug 29 2015, 10:19
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Aug 29 2015, 10:22
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
А разве while(1) не сам всевышний написал?  Цитата(zltigo @ Aug 29 2015, 14:14)  Попробуйте убедить своей "контраргументацией" разработчиков компиляторов, которые ругаются на while(CONST). Мне рассказывать, что ныне принято писать дерьмокод и посему это "нормально", пожалуйста, не надо. Из гарантированно мне известных это IAR и MS. Из гарантрованно плюющих помню только GCC. IAR в СИ-коде не выдаёт error или warning на while (Const). Если читаете ремарки Иара, то не передёргивайте. --- Надо создать доску позора с необоснованными ошибками компиляторов. Сам иногда удивляюсь логике ругательств.
Сообщение отредактировал GetSmart - Aug 29 2015, 11:33
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Aug 29 2015, 10:32
|

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

|
QUOTE (GetSmart @ Aug 29 2015, 13:22)  А разве while(1) не сам всевышний написал?  Всевышний, как написано в библии K&R а так-же в примерах в стандарте, в том числе и C11, написал совершенно однозначное for( ; ; )  Потом уже еретики начали писать while(1),while(2),while(3),.....,while(TRUE),while(true),while((_Bool)1) и так далее. Причем без всякой на то надобности. QUOTE (GetSmart @ Aug 29 2015, 13:22)  Надо создать доску позора с необоснованными ошибками компиляторов. Сам иногда удивляюсь логике ругательств. Начние с MISRA - там МНОГО веселее  . А с компиляторами все просто - если по какой-то причине, пусть даже по причине собвстенного несовершенства, компилятор сомневается, как понять, лучше пусть ПРЕДУПРЕЖДАЕТ. Я, если вдруг не смогу выразить мысль в однозначно понятной компилятору форме, лучше прагмой в этом месте сообщение подавлю, нежели получу неведомо что.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 29 2015, 11:25
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Что касается предупреждений по поводу управляющего выражения, то тут, по-моему, стоит разделять два случая: 1. Когда выражение изначально представляет собой константу: Код while(1) {...}
if(123) {...} /* Правда, выглядит ужасно? */ Тут предупреждение явно ни к чему. 2. Когда выражение обращается в константу на этапе компиляции: Код unsigned int x;
if(x >= 0) {...} В этом случае есть явный повод для предупреждения. Оформление бесконечного цикла - это уже дело вкуса программиста. Я, пожалуй, соглашусь, что for(;;) {..} лучше, просто на основании того, что if(1) {...} мне представляется ужасным. Но while(1) {...} все же ни малейшего отторжения не вызывает.
|
|
|
|
|
Aug 29 2015, 11:35
|

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

|
QUOTE (GetSmart @ Aug 29 2015, 13:43)  У цикла while только один аргумент - предусловие выполнения. Этот цикл логически естественнен для многих алгоритмов. Я что-то писал о неестественности цикла? Нет? Возражения только против того, что именно-то и УСЛОВИЯ быть-то и НЕ должно, ибо цикл БЕЗУСЛОВНЫЙ. Вот посему for c ОТСУТСТВУЮЩИМ условием есть логично, а while c БЕССМЫСЛЕННЫМ ВЫРАЖЕНИМ условия, есть настораживающий факт. QUOTE (aaarrr @ Aug 29 2015, 14:25)  что if(1) {...} мне представляется ужасным. Тем неменее изрядно часто используется if(0){...} для того что-бы закомментировать кусок исходника. Кому-то это уже ужасным не кажется  - типа очередной супертрюк - одним символом комментировать/раскомментировать. Задавлены предупреждения и понеслись писать говнокод.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 29 2015, 14:55
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(ViKo @ Aug 29 2015, 10:10)  Восклицательный знак в желтом треугольнике напротив опасной строки.  И подчеркивает красненьким опасное место. При наведении мыши на подчеркнутое или на значок выдается: warning: operator '<<' has lower precedence than '+'; '+' will be evaluated first На самом деле предупреждает не зря. Одно дело 1 << 7 + 16, а сам неоднократно накалывался на word = byte1 << 8 + byte2, хотя точно знаю, что приоритет у сложения выше. И только благодаря этому предупреждению не тратил время на поиски очевидной, но тем не менее пролетающей между глаз ошибки. По поводу вашего спора о do {} while (0). Единственное место, где это выражение необходимо - подобный функции макрос из более чем одного выражения. Который можно не задумываясь и однообразно вставлять в любое место, где допустим вызов функции, в том числе и в выражение if(cond) macro(); else ... И идите лесом с убеждениями меня в бессмысленности while(0) - он здесь делает именно то, что от него требуется. И я буду его использовать в линейном коде do { if(!func1()) break;... if(!func2()) break; ..... } while(0); потому что это совершенно однозначная конструкция, существенно упрощающая исходник. И мне глубоко фиолетово, что кому-то она эстетически неприятна.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Aug 29 2015, 14:59
|

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

|
QUOTE (Сергей Борщ @ Aug 29 2015, 17:55)  И мне глубоко фиолетово, что кому-то она эстетически неприятна. Дело совершенно не в эстетике. В безвыходных случаях можно использовать все. Вот я тоже использую, например для того, что-бы до поры до времени не трогать чужие исходники, например того-же FreeRTOS, где макросов дофига. Только у меня warning на это активизированы и давятся прагмами по месту. А в общем случае сложные макросы-псевдофункции просто не надо использовать - есть механизм заинлайнивания функций. Такой подход безопаснее. Warnig активизированы всегда по максимуму. Не для себя, а для того, что-бы были в качестве одного из индикаторов какчества попадающих в мои руки чужих исходников.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 29 2015, 16:01
|

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

|
QUOTE (Golikov A. @ Aug 29 2015, 18:42)  Горе тому программисту, который написав while(0) думает получить что то иное.... Горе тому, кто не может ни думать (а чего тут думать - трясти надо писать while(1) надо - так все индийские студенты пишут) ни даже читать: http://electronix.ru/forum/index.php?showt...t&p=1361255QUOTE ...собственно компилятор НЕ знает, что в исходнике написано while( 1 ) - он получает после препроцессора текст, а там могло быть написано и while( EPRST - eklmn() + 1 ) Тут можно уже подозревать ошибку, или?
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 29 2015, 16:20
|

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

|
QUOTE (aaarrr @ Aug 29 2015, 19:07)  Препроцессор тут с визгом притянут за уши. Это не аргумент. Совсем. А зачем писать на самом деле НЕПОНЯТНОЕ, хотя и "привычная", но бессмысленная конструкция while(1), на которую хоть и некоторые компиляторы, но ругатся (и правильно делают), вместо канонического варианта - цикл БЕЗ проверки условий, прямо для такого случая предусмотренного? Зачем? Что это вообще - "пока один"? Ну? Тогда-уж агитировали-бы за while( 1 == 1 ) по любому бессмысленная проверка неизменного условия, но хоть какой-то смысл типа "понятнее" можно было притянуть.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|