if (false)
От: igna Россия  
Дата: 25.11.09 15:11
Оценка: 6 (3) -1 :))) :)
Еще одно применение if (false):

    if (false)
        ;
#ifdef MACRO
    else if (cond1)
        expr1;
    else if (cond2)
        expr2;
#endif
    else if (cond3)
        expr3;
    else
        expr4;


Без if (false) можно:

#ifdef MACRO
    if (cond1)
        expr1;
    else
    if (cond2)
        expr2;
    else
#endif
    if (cond3)
        expr3;
    else
        expr4;


Но форматировщик VC 9.0 превращает это в следующее:

#ifdef MACRO
    if (cond1)
        expr1;
    else
        if (cond2)
            expr2;
#endif
        else
            if (cond3)
                expr3;
            else
                expr4;
Re: if (false)
От: Sni4ok  
Дата: 25.11.09 15:24
Оценка: +2
Здравствуйте, igna, Вы писали:

I>Еще одно применение if (false):


долго думал, но так и не уловил тайный смысл этого творчества.
Re[2]: if (false)
От: igna Россия  
Дата: 25.11.09 15:35
Оценка: -1 :)
Здравствуйте, Sni4ok, Вы писали:

S>долго думал, но так и не уловил тайный смысл этого творчества.


Значит недостаточно долго. Ну попробуй напиши то же самое без if (false).
Re[3]: if (false)
От: Sni4ok  
Дата: 25.11.09 15:38
Оценка:
Здравствуйте, igna, Вы писали:


I>Значит недостаточно долго. Ну попробуй напиши то же самое без if (false).


#ifdef MACRO
    if (cond1)
        expr1;
    else if (cond2)
        expr2;
    else 
#endif
    if (cond3)
        expr3;
    else
        expr4;
Re[4]: if (false)
От: igna Россия  
Дата: 25.11.09 15:44
Оценка:
Здравствуйте, Sni4ok, Вы писали:

S>#ifdef MACRO
S>    if (cond1)
S>        expr1;
S>    else if (cond2)
S>        expr2;
S>    else 
S>#endif
S>    if (cond3)
S>        expr3;
S>    else
S>        expr4;


Верно, но я пользуюсь форматировщиком VC 9.0, который превращает это в следующее:

#ifdef MACRO
    if (cond1)
        expr1;
    else if (cond2)
        expr2;
    else 
#endif
        if (cond3)
            expr3;
        else
            expr4;
Re: if (false)
От: ole! США http://files.rsdn.org/4543/rsdn.gif
Дата: 25.11.09 15:48
Оценка: +1
Здравствуйте, igna, Вы писали:

I>Еще одно применение if (false):


I>
I>    if (false)
I>        ;
I>#ifdef MACRO
I>    else if (cond1)
I>        expr1;
I>    else if (cond2)
I>        expr2;
I>#endif
I>    else if (cond3)
I>        expr3;
I>    else
I>        expr4;
I>


I>Без if (false) можно:


I>
I>#ifdef MACRO
I>    if (cond1)
I>        expr1;
I>    else
I>    if (cond2)
I>        expr2;
I>    else
I>#endif
I>    if (cond3)
I>        expr3;
I>    else
I>        expr4;
I>


тут не форматировщик VC 9.0 виноват.
каждый раз, когда я вижу на ревью подобный код с лестницей if'ов, да еще и вперемежку с макросами я просто заворачиваю ревью кода.
мой комментарий простой — это место нужно переделать, так как плотное нагромаждение условной логики влечет затем десятки коммитов с фиксами в этом месте, новыми if'ами, функция разрастается, юнит тестированию не поддается...
думаю, понятно
my $.02
Re: if (false)
От: Кодт Россия  
Дата: 25.11.09 15:51
Оценка: 2 (1)
Здравствуйте, igna, Вы писали:

I>Еще одно применение if (false):


Проще говоря, это способ открыть однородный список проверок, наподобие
#define BEGIN_IFS if(false) ;
#define   CASE(condition, action) else if(FOO(condition)) BAR(action);
#define END_IFS   else ;
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Перекуём баги на фичи!
Re[2]: if (false)
От: igna Россия  
Дата: 25.11.09 15:52
Оценка:
Здравствуйте, ole!, Вы писали:

O>мой комментарий простой — это место нужно переделать


Никак объектно-ориентированное программирование советуешь применить?
Re[5]: if (false)
От: Sni4ok  
Дата: 25.11.09 15:53
Оценка: +1 :)
Здравствуйте, igna, Вы писали:

I>Верно, но я пользуюсь форматировщиком VC 9.0, который превращает это в следующее:


я не знаю что такое форматировщик(хотя смутно подозреваю, что вы о редакторе), и vc 9.0 я даже в глаза не видел, мы тут как бы с++ обсуждаем или может давайте о ноутпаде с вордом поговорим?
Re[6]: if (false)
От: igna Россия  
Дата: 25.11.09 15:58
Оценка:
Здравствуйте, Sni4ok, Вы писали:

S>я не знаю что такое форматировщик(хотя смутно подозреваю, что вы о редакторе), и vc 9.0 я даже в глаза не видел, мы тут как бы с++ обсуждаем или может давайте о ноутпаде с вордом поговорим?


Если не знаешь ... трам-та-та-там (здесь)
Re[2]: if (false)
От: TimurSPB Интернет  
Дата: 25.11.09 16:15
Оценка:
O>мой комментарий простой — это место нужно переделать, так как плотное нагромаждение условной логики влечет затем десятки коммитов с фиксами в этом месте, новыми if'ами, функция разрастается, юнит тестированию не поддается...
O>думаю, понятно

А можно подробнее?
Про макросы понятно.
Чем заменяете if'ы?
Make flame.politics Great Again!
Re: if (false)
От: frogkiller Россия  
Дата: 25.11.09 16:21
Оценка: +4 :))
Здравствуйте, igna, Вы писали:

I>Еще одно применение if (false)


...

Дожили... язык программирования в качестве костыля для IDE
Курица — это инструмент, с помощью которого одно яйцо производит другие.
Re[2]: if (false)
От: Кодт Россия  
Дата: 25.11.09 16:22
Оценка: 1 (1)
Здравствуйте, ole!, Вы писали:

O>каждый раз, когда я вижу на ревью подобный код с лестницей if'ов, да еще и вперемежку с макросами я просто заворачиваю ревью кода.

O>мой комментарий простой — это место нужно переделать, так как плотное нагромаждение условной логики влечет затем десятки коммитов с фиксами в этом месте, новыми if'ами, функция разрастается, юнит тестированию не поддается...

Карты условий (WTL — MSG_MAP, ATL/COM — INTERFACE_MAP) принимаешь или заворачиваешь?
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Перекуём баги на фичи!
Re: if (false)
От: ilvi Россия  
Дата: 25.11.09 16:36
Оценка:
Здравствуйте, igna, Вы писали:

I>Еще одно применение if (false):


Страшно...
Никак нельзя этот каскад if-ов заменить, это же достанется поддерживать такое голову себе поломаешь вглядываесь в это нагромождение.
Ну в это еще может и нормально, но если там еще условий 6 в реальном коде, то меня бы совесть мучила.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Re[2]: if (false)
От: Alexander G Украина  
Дата: 25.11.09 16:50
Оценка:
Здравствуйте, frogkiller, Вы писали:

F>Дожили... язык программирования в качестве костыля для IDE


Бывает. И не только для IDE. Триграфы для доксигена
Автор: Alexander G
Дата: 14.01.09
.
Русский военный корабль идёт ко дну!
Re[3]: if (false)
От: Mephisto666 Великобритания  
Дата: 25.11.09 19:51
Оценка:
Здравствуйте, igna, Вы писали:

I>Значит недостаточно долго. Ну попробуй напиши то же самое без if (false).


Есть удобное решение — не писать так.
Скрывать ошибки проектирования нагромождениями из макросов это стиль раннего Микрософт.
Re[5]: if (false)
От: k55 Ниоткуда  
Дата: 26.11.09 06:31
Оценка:
Здравствуйте, igna, Вы писали:

I>Верно, но я пользуюсь форматировщиком VC 9.0, который превращает это в следующее:

А если вот так:

I>
I>#ifdef MACRO
I>    if (cond1)
I>        expr1;
I>    else if (cond2)
I>        expr2;
I>    else 
I>#endif
      {
I>        if (cond3)
I>            expr3;
I>        else
I>            expr4;
      }
I>
Если есть желание — найдется 1000 возможностей.
Если нет желания — найдется 1000 причин.
Re: if (false)
От: sokel Россия  
Дата: 26.11.09 08:06
Оценка:
Здравствуйте, igna, Вы писали:

if(...); без выражения ещё бывает полезен в подобных случаях:

namespace LOG
{
    // функция проверки возможности вывода в лог 
    inline bool available(int source, int severity) { ... }
    // функции вывода в лог
    void out(int src, int svr, cont char* fmt, ...);
    void va_out(int src, int svr, cont char* fmt, va_list va);
    // обертка для макроса
    struct proxy
    {
        int src, svr;
        log_proxy(int src, int svr) : src(src), svr(svr) {}
        void out(const char* fmt, ...) { va_list va; va_start(va, fmt); va_out(fmt, va); va_end(va); } // это можно уже и в модуль вынести
    };
}
// для удобства исопльзования заворачиваем логирование в макрос
#define LOG_OUT(SRC,SVR) if(!LOG::available(SRC,SVR)); else LOG::proxy(SRC,SVR).out

// далее в коде:
LOG_OUT(SRC_DBC, SVR_ERROR)("some error: %u", err);
Re: if (false)
От: jazzer Россия Skype: enerjazzer
Дата: 26.11.09 08:21
Оценка: 2 (2)
Здравствуйте, igna, Вы писали:

I>Еще одно применение if (false):


Вроде стандартная техника, известная от сотворения мира...

Аналогичный трюк:
select .... from ...
where 1=1
and ...
and ...
and ...

теперь можно закомментировать каждый 'and' или даже все сразу, и запрос будет работать — очень удобно при отладке запроса
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: if (false)
От: igna Россия  
Дата: 26.11.09 09:16
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Вроде стандартная техника, известная от сотворения мира...


Потому и написал "Еще одно применение". Форматировщик-то тот самый был сотворен позднее чем мир.
Re[2]: if (false)
От: LaptevVV Россия  
Дата: 26.11.09 09:30
Оценка: +1
Здравствуйте, frogkiller, Вы писали:

F>Дожили... язык программирования в качестве костыля для IDE

Так и должно быть!
Язык программирования должен позволять писать модули для расширения ИДЕ.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: if (false)
От: andrey.desman  
Дата: 26.11.09 11:35
Оценка:
Здравствуйте, igna, Вы писали:

I>Еще одно применение if (false):


...

Если условия и действия записываются кратко и возвращают что-то осмысленное, то такая запись мне кажется более удачной:
cond1 && expr1 ||
cond2 && expr2 ||
cond3 && expr3 ||
false;


Хотя все условия соблюдаются редко. Обычно такое прокатывает просто как замена одному if.
i < 0 && (i = -i);


Таблицу функций можно сделать, опять же ( {int (*cond)(); void (*act)();} ), а с шаблонами так вообще можно намутить Вариантов масса...
Re[2]: if (false)
От: igna Россия  
Дата: 26.11.09 11:43
Оценка:
Здравствуйте, andrey.desman, Вы писали:

AD>Если условия и действия записываются кратко и возвращают что-то осмысленное, то такая запись мне кажется более удачной:

AD>cond1 && expr1 ||
AD>cond2 && expr2 ||
AD>cond3 && expr3 ||
AD>false;


Тот самый форматировщик превратит это скорее всего вот во что:

cond1 && expr1 ||
    cond2 && expr2 ||
    cond3 && expr3 ||
    false;


Так что, тогда уж так:

    false
        || cond1 && expr1
        || cond2 && expr2
        || cond3 && expr3
        ;


Re[3]: if (false)
От: andrey.desman  
Дата: 26.11.09 11:47
Оценка:
Здравствуйте, igna, Вы писали:

I>Тот самый форматировщик превратит это скорее всего вот во что:

...

Я не создаю себе проблем на ровном месте и форматировщиком не пользуюсь. Я пользуюсь VIM
Re[3]: if (false)
От: trophim Россия  
Дата: 28.11.09 20:57
Оценка:
Та хто ж это такой, этот таинственный "Форматировщик"???
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Let it be! — Давайте есть пчелу!
Re[2]: if (false)
От: igna Россия  
Дата: 29.11.09 08:05
Оценка:
Здравствуйте, sokel, Вы писали:

S>#define LOG_OUT(SRC,SVR) if(!LOG::available(SRC,SVR)); else LOG::proxy(SRC,SVR).out


А что будет не так, если записать без хитростей?:

#define LOG_OUT(SRC,SVR) if(LOG::available(SRC,SVR)) LOG::proxy(SRC,SVR).out
Re[3]: if (false)
От: MT-Wizard Украина  
Дата: 29.11.09 08:31
Оценка: :)
Здравствуйте, igna, Вы писали:

I>Здравствуйте, sokel, Вы писали:


I>А что будет не так, если записать без хитростей?:


Ну...
if (foo())
   LOG_OUT(bar, baz);
else
   do_smt();

А ти, москалику, вже приїхав (с)
Re[2]: if (false)
От: Кодт Россия  
Дата: 29.11.09 18:54
Оценка:
Здравствуйте, andrey.desman, Вы писали:

AD>Если условия и действия записываются кратко и возвращают что-то осмысленное, то такая запись мне кажется более удачной:

AD>
AD>cond1 && expr1 ||
AD>cond2 && expr2 ||
AD>cond3 && expr3 ||
AD>false;
AD>

Когда компилятор научится расставлять точки для прерываний внутрь выражений — тогда этот подход будет иметь полное право на жизнь. А пока что, такой многоэтажный or-else — как минимум, издевательство при отладке.

Ну и ещё, все expr надо заменить на ((void)(expr), true).
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.