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

0

  1. 1
if(0){}else for (... тут всякий код...) и тут всякий код

Из реализации foreach в Qt. Не ГК. Кто первый скажет почему не ГК получит пирожок с полочки.

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

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

  • Исправляет область видимости "всякого кода"? Гугл подсказывает о баге, с ней связанным, в старых версиях Visual Studio.
    Ответить
    • Ненене, это не говнецо. Говнецо в VS, а это классическая подпорка, в простонародье именуемая "костылём" )
      Ответить
  • Ну, так избитая классика жанра - в С++ исправление scope переменной, объявленной в заголовке цикла 'for'. Т.е. в

    for (int i = 0; ... )


    переменная 'i' не должна существовать после тела 'for'. А в старом VC++ она продолжала жить и далее.

    Только в явно выписанном коде подобный трюк с 'if;else' не имеет никакого смысла - можно было просто взять этот 'for' в дополнительные скобки '{}' и дело с концом. Из поста не ясно, было ли это в оригинале макросом, или все таки было выписано посередине обыкновенного кода. В последнем случае - есть элемент "говнокодовости".

    Так вот, этот трюк с 'if;else' применяется именно для написания макроса/макросов, решающего данную проблему. В частности, самым радикальным вариантом будет просто сделать

    #define for if (false); else for


    т.е. фактически нагло "переопределить" ключевое слово 'for' и вопрос решен.

    А сам трюк с 'if;else' (вне зависимости от проблемы с 'for') произрастает из техники правильного написания многострочных (т.е. много-stetement-ных) макросов. Правильно написанный многострочный макрос должен быть либо заооболочен в скобки 'do{ ... } while (false)', либо в скобки 'if (false); else { ... }'. Подобная "оболочка" вокруг макроса делает его поведение правильным при использовании в ветках внешних if-ов.
    Ответить
    • У Вас нет своего блога или статей по программированию? Я бы с большим удовольствием почитал. 🙂
      Ответить
    • > Из поста не ясно, было ли это в оригинале макросом, или все таки было выписано посередине обыкновенного кода.

      Да, код взят из макроса foreach.
      Ответить
      • Надо чтобы макрос вел себя правильно во внешних if-ах, как я говорил выше. Если сделать по-вашему, то вот в таком коде

        if (условие)
           for (тра-ля-ля) {
             чего-то делаем;
           }
        else {
          чего-то делаем;
        }


        ветка 'else' будет проассоциирована с "невидимым" if-ом спрятанным внутри макроса 'for'. Это, разумеется, будет большой неожиданностью для автора кода и доставит ему массу счастливых часов недоуменной отладки.
        Ответить
    • дай-ка угадаю: Макроёбы делают?
      Ответить
        • https://govnokod.xyz/_10306/#comment-137822

          >>
          А сам трюк с 'if;else' (вне зависимости от проблемы с 'for') произрастает из техники правильного написания многострочных (т.е. много-stetement-ных) макросов. Правильно написанный многострочный макрос должен быть либо заооболочен в скобки 'do{ ... } while (false)', либо в скобки 'if (false); else { ... }'. Подобная "оболочка" вокруг макроса делает его поведение правильным при использовании в ветках внешних if-ов.
          >>>
          Ответить
  • Поскольку я ничего не умею, то вряд ли я могу найти работу побогаче. Правда, иногда попадаются вакансии, где предлагают в два раза больше с теми же требованиями. Но я вряд ли составлю туда конкуренцию. Наверняка туда уже молодых 50 человек понабежало. А я, с точки зрения работодателя, если за 8 лет в фронтенде не научился тесты писать и никогда вебпак не настраивал, то, видимо, и не научусь.
    Ответить
  • да ну его нафиг. Это залупа какая то. Вместо человеческого cntrl+s каждый раз этот танец с бубном делать. Пошли они **** со своим гитом. Это как покакать и вместо того чтобы просто подтереться и помыть руки с грязными начинаешь в тетрадку записывать. Какашка отправлена, бумага получена. Прям непередаваемая жесть.

    К счастью в сфере производства обычных сайтов это все же не отраслевой стандарт. Иначе б у меня вообще никогда работы не было.
    Ответить

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

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

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


    8