|
|
  |
Косяк у Кейла, Препроцессор не следит за скобками |
|
|
|
Oct 20 2015, 18:55
|

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

|
QUOTE (Golikov A. @ Oct 20 2015, 21:14)  Надо бывает много для чего, ну и чем for(;;) {break} или switch(0){} лучше while{}do(0), ну кроме того что вы его лично не любите? 1) Не надо было вообще ТАК писать, а написав, уж точно не страдать фигней и не преписывать неведомо зачем. Это понятно? 2) for(;;){breaк} абсолютно естественно без всяких натяжек. while... ненужный трюк со скользким условием на который нормальный компилятор выдает warning. "Личная нелюбовь" нипричем. Сколько раз будете спрашивать одно и то-же? Не надоело? Ответ давался. switch... примерно те-же яйца в профиль, что и while...
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Oct 20 2015, 19:11
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
1) бывают разные ситуации и условия, и иногда надо делать не что хочется. Это понятно? 2) цикл do{}while(условие) стандартом определен? - определен. 0 - как ложное условие стандартом определен? - определен. Значит никакого нарушения стандарта нет. То что ваш любимы компилятор выдает на это варнинг ничего ровным счетом не значит, кроме того что авторы компилятора посчитали эту конструкцию более редкой и предупредели об этом, просто указав вам на возможную ошибку. Ровно как то что он не выдает варнинг на for(;;), потому что эту конструкцию авторы посчитали более часто употребимой. И ВСЕ!!! Я вот тут недавно вообще столкнулся с проверкой кода по формальным признакам и узнал много много нового  о том как надо и как не надо писать, и в этой области нарушения - это не варнинги, это ерроры, и писать надо как предписывают правила, а не блаж компилятора. Лично добавил несколько определений которые теперь висят у меня варнингом в среде, потому что иначе это была ошибка на формальной проверке и ничего не поделаешь.... Так что пока вы не покажете строчку стандарта где написано что конструкция do{}while(flase) запрещена, или выполниться не 1 раз, или что 0 под while будет трактован как-то еще кроме как ложь, все ваши аргументы будут лишь вашим личным субъективным мнением. Которое истинна только для вас
|
|
|
|
|
Oct 20 2015, 21:48
|

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

|
QUOTE (Golikov A. @ Oct 20 2015, 22:11)  и узнал много много нового... остается только надеяться, что это не последнее новое, что Вы узнаете и то, что в процессе "узнавания" сможете сохранить способность самостоятельно думать. Начать попытки думать можете с объясния того факта, что мне известы, как минимум, три компилятора выдающих предупреждение на всякие while(1) и ни одного компилятора не понимающего, в отличие от Вас, for(;;). Это раз. А так-же того факта, что нет никакой необходимости использовать все эти while(1) и do(0).
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Oct 20 2015, 22:31
|
Профессионал
    
Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439

|
Цитата(zltigo @ Oct 20 2015, 20:34)  Код ...
for(;; ) { if (cond1) break; .... if(cond2) break; .... break; } Не помню деталей, но надо было, чтобы точка с запятой требовалась в конце да и ваш вечный цикл требует не забыть брейк в конце. Вот это уже как раз кривая натяжка.
Сообщение отредактировал IgorKossak - Oct 21 2015, 18:02
Причина редактирования: избыточное цитирование
|
|
|
|
|
Oct 20 2015, 22:39
|

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

|
QUOTE (Golikov A. @ Oct 21 2015, 01:24)  Я могу прямо сейчас создать корпоротивное правило запрещающее использовать for(;;) Вы уже создали себе в голове "правил"  . Ну и что? Задача убедить остальных жить по Вашим правилам. Та же история с языком и компилятором который Вы грозитесь написать. QUOTE Также я могу вам привести пример того когда это необходимо. До сих пор этого здесь никто не смог, включая Вас. QUOTE Вы трактуете мир на основании вашего несовершенства. Вы уверены что все дураки, кроме вас, а это между прочем грех и гордыня. С чего вы взяли что ваша старческая истерика лучше чем мысли других людей? Вы ведь не только мне написали в вызывающем тоне про думать и тому подобное? Истерику это Вы сейчас демонстрируете в полный рост. Аргументов нет, вот и понеслись из Вас всякие передергивания "все дураки" да ссылки на "других людей", "старческие". За себя сами научитесь отвечать. QUOTE (Tarbal @ Oct 21 2015, 01:31)  Не помню деталей.. Впомните - расскажете  QUOTE и ваш вечный цикл требует не забыть брейк в конце. А другой "не забыть" while(0) после  где весь перечень того, чего нельзя забывать при программировании
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Oct 24 2015, 08:35
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Чужие исходники это кладезь хитровывертов. файл inflate.c Код #define NEXTBYTE() ({ int v = get_byte(); if (v < 0) goto underrun; (uch)v; })
в коде
NEXTBYTE(); /* Get timestamp */ NEXTBYTE(); NEXTBYTE(); NEXTBYTE();
(void)NEXTBYTE(); (void)NEXTBYTE();
magic[0] = NEXTBYTE(); На каком языке это написано? Внутри круглых скобок можно использовать фигурные? uch вероятно объявлено как unsigned char. Как мне понимается, препроцессор заменит текстовым содержимым дефайна все заголовки NEXTBYTE(), встречающиеся в исходном тексте. Во-первых, разве в Си можно узнать значение локальной переменной вне блока, в котором она объявлена? Во-вторых, разве точка запятой, завершающая оператор/statement не отбрасывает значение rvalue? --------------- Что на вызовы через декларации не выдаются даже ремарки по терминологии ИАРа - это однозначно сговор.
Сообщение отредактировал GetSmart - Oct 24 2015, 08:41
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Oct 24 2015, 08:58
|

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

|
QUOTE (GetSmart @ Oct 24 2015, 11:35)  ...кладезь хитровывертов. Нет. Это кто-то тупо мучал компилятор до тех пор пока что-то не "заработало" а остальное потом "отладит". QUOTE На каком языке это написано? Олбанский?
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Oct 24 2015, 12:06
|
Знающий
   
Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153

|
Цитата(GetSmart @ Oct 24 2015, 11:35)  На каком языке это написано? Внутри круглых скобок можно использовать фигурные? Во-первых, разве в Си можно узнать значение локальной переменной вне блока, в котором она объявлена? Во-вторых, разве точка запятой, завершающая оператор/statement не отбрасывает значение rvalue? Это расширение gcc такое.
|
|
|
|
|
Nov 16 2015, 03:09
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(Непомнящий Евгений @ Oct 24 2015, 16:06)  На первый взгляд, это какая-то лишняя сущность с нестандартным синтаксисом. Равноценно заменяется инлайн-функцией. Инлайн поддерживают все современные компиляторы. Имея все плюшки этой сущности и не ухудшая читабельность и красоту стандарта. goto изнутри круглых скобок во вне скобок - имхо бэд бэд стайл, особенно в макросе. Цитата(zltigo) Олбанский? zltigo стыдно не знать распостранённые диалекты Си. Цитата(GetSmart) Что на вызовы через декларации не выдаются даже ремарки по терминологии ИАРа - это однозначно сговор. Конечно же только на вызовы с параметрами. Не предусмотреть даже ручную включалку - злодеяние.
Сообщение отредактировал GetSmart - Nov 16 2015, 11:49
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Nov 16 2015, 15:33
|
Знающий
   
Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153

|
Цитата(GetSmart @ Nov 16 2015, 06:09)  На первый взгляд, это какая-то лишняя сущность с нестандартным синтаксисом. Равноценно заменяется инлайн-функцией. Инлайн поддерживают все современные компиляторы. Имея все плюшки этой сущности и не ухудшая читабельность и красоту стандарта. goto изнутри круглых скобок во вне скобок - имхо бэд бэд стайл, особенно в макросе. Как сказать, штука иногда удобная. Инлайн-фукнции тут не причем. Это обычный блок кода, в котором можно использовать локальные переменные функции, и в котором есть собственные локальные переменные. Но в отличие от обычного блока он умеет возвращать результат. К примеру Код void f() { int a, b; ... const int c = { // константа со сложной формулой расчета int d = a + b + 42; if (d) d = g(d); if (d) d = q(d); d; } } В современных плюсах можно извернуться через замыкание Код void f() { int a, b; ... const int c = [&]{ int d = a + b + 42; if (d) d = g(d); if (d) d = q(d); return d; }(); }
|
|
|
|
|
Nov 17 2015, 05:44
|
Знающий
   
Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153

|
Цитата(GetSmart @ Nov 17 2015, 02:44)  Разве в первом примере не нужны круглые скобки, окружающие блок с фигурными? Нужны, ошибся Цитата И этот пример из серии за уши притягивания. В классическом Си такие значения хранились бы в переменных. В полноценном смысле константа - то, что расчитывается на этапе компиляции. Что такое классический Си? Керниган и Ричи, первое издание?  Жизнь не стоит на месте. Там уже и атомики в стандарте появились, и bool, и константы времени исполнения. Конкретно эта штука - расширение gcc (в стандарте его нет) Цитата Во-вторых, инлайн честно может юзать локальные переменные вызывающей функции, только они должны передаваться через список аргументов функции. Это и стандартно и читабельно и безопасно. Может, вот только писанины больше. Плюс мы имеет дополнительную лишнюю сущность - статическую функцию, которая дергается из одного места. Цитата Для макроса по-другому опять же бэд бэд стайл. Это как? Даже если у макроса есть аргументы, то там просто текстовая подстановка, аргументы будут "прочитаны" в момент обращения. Ну и кстати - пример с замыканием из плюсов - это как раз ваша полноценная функция, просто с упрощенным синтаксисом. Как и какие локальные переменные будут захвачены - можно настроить в широких пределах Цитата(Arlleex @ Nov 16 2015, 23:05)  Неоднократно встречаю в проекте, что Keil подсвечивает некоторые #define красным крестиком, при наведении пишет undefined sybol. Но проект собирается. Не только #define, кстати, но и некоторые функции. Думаю и вы неоднократно замечали. Это, вообще говоря, как? Почему проект собирается, ведь это фатальная ошибка при сборке? Кейлом не пользовался, но рискну предположить, что сборку делает компилятор, а данные для подсветки синтаксиса берутся из парсера самого кейла. Если этот парсер криво настроен (не видит каких-то инклюдов, предопределенных макросов и т.п.) или в нем есть баги - будут глюки с подсветкой и автокомплитом.
|
|
|
|
|
  |
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0
|
|
|