Кресты / Говнокод #11573 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
void somefunc(bool val)
{
    assert(0 == val || 1 == val);
...
}

Многоуровневый говнокод. Во первых, индусское сравнение задом наперед. Во вторых, выражение в ассерте всегда истенно. Когда GCC возбухнул по этому поводу, то код был за-#ifdef-ен, но оставлен для других менее умных компиляторов.

Запостил: alexzak alexzak, (Updated )

Комментарии (18) RSS

  • >индусское сравнение задом наперед
    Недавно на си-подобных языках начал писать, да?
    Ответить
  • Классический бульшит.

    Возможно данный код был портирован с Си, где вместо bool использовали int, и проверяли этот самый инт на допустимые значения. При портировании int превратился в bool, а assert убрать забыли.

    0 == val не говно, а способ избежать глупой ошибки на старых компиляторах, которые не умели выдавать предупреждение о попутанных = и ==.

    P.S. Кстати в assert это предупреждение и сейчас не выдается 😉 Только в if/while и им подобных.
    Ответить
    • Этот код не был портирован с С. Это новый код. На С++. Свеженкий, тепленький еще.

      И все-таки 0 == val - это говно!
      Ответить
    • Ну откуда вы лезете? Так хуже всего, что Борманд комментом выше разжевал.
      Ответить
  • Не понятно только одно - зачем на C++ для bool делать эту проверку?

    Если C и bool - тупо typedef unsigned char bool, то да - может и есть смысл.
    А то был у нас проект для embedded железяки - там кто что хотел, то и дефайнил как TRUE, но FALSE всегда был 0. И это порождало столько проблем, что в конечном итоге это привело к добавлению в стиль кодирования условия, говорившего что с TRUE в логических выражения сравнивать ни в каком случае нельзя - надо выражения выстраивать так чтоб сравнивалось с FALSE.

    Ну пусть даже у ОПа такая запущенная ситуация, но почему было не сделать макрос IS_BOOL(var) ?
    Ответить
    • > надо выражения выстраивать так чтоб сравнивалось с FALSE
      Вот за сравнение чего-либо с TRUE и FALSE (да и true и false) нужно убивать. Это же типичный бульшит...
      if (foo) { // true; }
      if (!foo) { //false; }
      Ответить
        • > А если кто TRUE и FALSE передефайнит???

          > там кто что хотел, то и дефайнил как TRUE
          > но FALSE всегда был 0

          При таких условиях работать будет без проблем.
          Ответить
  • - А ещё... ещё он спросил, хочу ли я, чтобы он стал моим парнем!
    Ответить

Добавить комментарий

Где здесь C++, guest?!

    А не использовать ли нам bbcode?


    8