1. C++ / Говнокод #26578

    0

    1. 1
    2. 2
    https://upload.wikimedia.org/wikipedia/commons/0/0e/Bjarne-stroustrup_%28cropped%29.jpg
    https://cdn.jpg.wtf/futurico/cb/3e/1586622557-cb3e3c00a16ab8b849e9464c1e3037ea.jpeg

    Шок! Рецепты защиты от коронавируса, от создателя языка C++. Надо всего лишь...

    Запостил: j123123, 13 Апреля 2020

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

    • Вот к чему C++ приводит!
      Ответить
      • Прикольно. Но, к сожалению, не он. Форма ушей не совпадает:
        http://i.ytimg.com/vi/6lJwgA0bNCc/maxresdefault.jpg
        Ответить
      • Не пойму, зачем полотёры носят за спиной оранжевые тяжелые банки со спиртом...
        Спирт можно и выпить, а дверные ручки опрыскивать из передней форсунки.
        Ответить
    • Они же не прилегают. Вот как надо:
      https://borodatiyvopros.com/wp-content/uploads/2020/03/8687_140895_5.jpg
      Ответить
    • эти днищёвые шутки и сюда добрались?
      Ответить
    • Кстати я давно уже вывел рецепт выращивания C++ хейтера.
      Сначала возьмите человека, который программирование вообще нихуя не знает, обучите его языку Си. Можно конечно начать с какого-нибудь паскаля, а потом переучить на Си, то один хрен. Потом покажите ему язык очень высокоуровневый, например какой-нибудь диалект лиспа, ту же Scheme например. Пусть прорешает ченить из SICP. После этого, если такому человеку показать кресты, он просто будет блевать от них
      Ответить
      • >Можно конечно начать с какого-нибудь паскаля, а потом переучить на Си

        На этом этапе фейл. Получим Тараса-сишкохейтера.

        А что это в массивах нету размера?
        А что это массив передаётся как укозатель?
        А почему такой ублюдочный switch?
        А сдвиг это тоже UB?
        А почему в языке так много UB?
        А почему enumы такое говно? В паскале как надо сделали.
        А где тут нормальные строки? char*? Фу блядь.
        А почему 010!=10?
        итд.

        Человек отчаивается, идёт учить С++.
        Ответить
        • > Человек отчаивается, идёт учить С++.
          С++ это в основе то же говно что и Си, только там сверху еще нового говна накидали, с новыми UB-ами, новыми способами отстрела ног и припизданутым стандартом, который ни один компилятор полностью не реализует. Так что учить крестоговно после сишки это как сказать "Ну вот навернул я этого собачьего дерьмища, но как-то неочень, надо б разбавить его свинным дерьмищем"
          Ответить
          • Да ну, в крестах как-то логичнее и удобнее. Можно вернуть массив, можно принять массив одним аргументом. Можно забыть про goto free_everything, а просто сделать локальную переменную, у которой сработает деструктор. Можно не придумывать одной и той же функции (например, average) несколько имён, когда реализуются её альтернативы. Можно написать полиморфную функцию без идиотского void*.

            После сраной сишки, где деревянные игрушки и ничего нет из коробки, кресты кажутся образцом здравого смысла.
            Ответить
            • > После сраной сишки, где деревянные игрушки и ничего нет из коробки, кресты кажутся образцом здравого смысла.
              Именно поэтому я и написал, что на кресты надо смотреть после сишки и после какого-то намного более высокоуровневого языка. Тогда кресты будут выглядеть как кривой набор уродских костылей над сишкой, чем они и являются
              Ответить
              • Я это потом прочитал чуть ниже по странице, да.
                Ответить
      • А почему присваивание работает с побочным эффектом?
        А зачем в сишке столько неявных конверсий типов?
        А что такое signed char unsigned char? Ээээ.
        А в Паскале компилятор не давал мне спутать сравнение и присваивание if (a=5).
        А что инкременты тоже возвращают значение?
        while (*a++=*b++); это идиоматично?
        А что выведет код i+= ++i + ++i?
        UB?
        Идите нахуй со своей сишкой.
        Ответить
        • > что такое signed char и unsigned char...

          ... и чем от них отличается обычный char.

          Что такое strict aliasing и как всё-таки посмотреть на биты во float'е?
          Почему вместо модулей какая-то тупая фигня, которая ещё и тормозит?
          Почему в функцию без аргументов их можно передать сколько угодно?
          Зачем strcpy и strcat возвращают указатель на начало буфера?
          Ответить
        • показать все, что скрытоvanished
          Ответить
          • std::array завернуть в struct
            Ответить
            • Эти сраные std::huita контейнеры в микроконтроллерах неюзабельны
              Ответить
              • Чем std::array-то не угодил? Он же даже не динамический.
                Ответить
                • У крестов с freestanding'ом проблема. Стандартная либа начинает тащить с собой всякое говно, приходится её полностью отрубать и писать снуля.

                  Вроде как собираются прочистить всё это говно вилкой и выделить хедера, которым не нужен рантайм и операционка. Х.з. насколько это будет юзабельно.
                  Ответить
                  • https://bitbashing.io/embedded-cpp.html вот кстати интересная статья о том, как можно обрезать крестоговно для контроллеров

                    Получается сишка с каким-то крестовым полурабочим огрызком

                    >The libgcc versions assume a Unix-like userspace, so we should define our own. If we’re trying to avoid dynamic memory allocation, a call to delete is probably a serious bug, and we should likely panic.

                    void operator delete(void* p)
                    {
                        DIE("delete called on pointer %p (was an object heap-allocated?)", p);
                    }


                    // Same as above, just a C++14 specialization.
                    // (See http://en.cppreference.com/w/cpp/memory/new/operator_delete)
                    void operator delete(void* p, size_t t)
                    {
                        DIE("delete called on pointer %p, size %zu", p, t);
                    }
                    Ответить
                    • Там же проблема не в самом делете.

                      А в виртуальных деструкторах.

                      However, operator delete is required whenever we give a base class a virtual destructor—as is standard practice—even if we never heap-allocate an object of that class.
                      Ответить
              • Так зачем возиться с этим кастрированным говном, когда можно в терминах, приближенных к предметной области, писать на нормальных языках с полиморфизмом и абстракциями под нормальное железо?
                Пусть под микропердоллеры пишут какие-нибудь заедушные питушни, которым не хватило нормальной работы.
                Ответить
          • Через структуру.
            Ответить
        • > А что такое signed char unsigned char? Ээээ.
          А в крестах это изменили?

          > А в Паскале компилятор не давал мне спутать сравнение и присваивание if (a=5).
          А в крестах это изменили?

          > А что инкременты тоже возвращают значение?
          А в крестах это изменили?

          > А что выведет код i+= ++i + ++i?
          А в крестах это изменили?

          > UB?
          А в крестах это изменили?

          > Идите нахуй со своей сишкой.
          И с крестоговном тоже нахуй идите
          Ответить
          • Суть вообще в том, что сначала ты смотришь на примитивную сишку, с кучей всякой хуйни с UB, какими-то непонятками с strict aliasing и прочими такими шероховатостями, потом ты смотришь на реально мощный высокоуровневый язык, с мощным метапрограммированием, нормальной рефлексией, макросами... а потом ты смотришь на крестопарашное дерьмище, когда сишку обмотали какими-то блядскими кривыми костылями и пытаются на этом недоразумении что-то серьезное делать
            Ответить
            • Ko-ko-ko-ko-ko!
              Ответить
            • показать все, что скрытоvanished
              Ответить
            • Полностью поддерживаю. Однако, препроцессора и шаблонов очень не хватает в каких-нибудь ЯВУтухах. Неясно, почему в мире высокого уровня негласно считается зашкваром параметризовать код и скомпилировать его сразу как надо, а не подставлять параметры в рантайме.
              Ответить
              • Преждевременная оптимизация потому что.

                Зачем в сишном софте делают кококонфиги, хотя можно просто перекококонпелировать?
                Ответить
                • Одно дело - когда параметры нужно менять, а другое - когда они всегда одни и те же.
                  Ну разве что в Debug-версии не вкомпиливать параметры, а оставить подстановку в рантайме, чтобы можно было быстро скомпилировать и проверить.
                  Ответить
                • Потому что перекомпилировать иногда малость накладно. Не, конечно можно такую хуйню сделать, чтоб например программа чекала конфиг, если конфиг отличается от того, с которой она раньше компилировалась, она вызывает специальный компилятор, который бы пересобрал эту программу с новым конфигом, и такая говностратегия даже может добавить пирфоманса, если например этот конфиг содержит в себе некий хитровыебаный байткод, который можно дополнительно заоптимизировать.

                  Но вот если у тебя контроллер, то запихнуть компилятор или какое-то JiT-говно в него, которое б пересобирало прошивку в самом контроллере при изменении настроек - малость проблематично.
                  Ответить
              • показать все, что скрытоvanished
                Ответить
            • Сишка — слаботипизированный язык.
              Под любой примитивной абстракцией (будь-то bool, char, enum) скрывается обычный int. Который хуй пойми что и равен размеру регистра.

              char сам по себе — особый пиздец.
              https://stackoverflow.com/questions/2172943/size-of-character-a-in-c-c

              В целом С++ гораздо более строготипизирован чем сишка.

              В крестах пытались всё это дерьмо починить.
              Хотели как лучше — получилось как обычно.
              Ответить
              • > более строготипизирован

                Угу, у крестов три разных чара (char, signed char и unsigned char - разные типы) а не два, как у сишки. Прогресс, блджад.
                Ответить
                • показать все, что скрытоvanished
                  Ответить
                • Хмм, по-моему в Си тоже три разных чара
                  Ответить
                  • показать все, что скрытоvanished
                    Ответить
                  • В сишке это не принципиально, перегрузок всё равно нет и отличить их друг от друга невозможно. В крестах же это реально 3 разных типа.
                    Ответить
                    • Через _Generic вполне возможно https://wandbox.org/permlink/EH5I1XUQrtisSEnR

                      Ну и можно еще отличить например по наличию UB при знаковом переполнении
                      Ответить
                      • О как, т.е. в сишке это тоже 3 разных типа... Пиздец.
                        Ответить
                • В крестах кстати добавили std::byte, так что там аж 4 теперь
                  Ответить
                  • Это специальный массив бит, над которым нельзя совершать арифметические действия.
                    Его специально добавили, поскольку это не char. Хотя c другой стороны:
                    enum class byte : unsigned char {} ;

                    Прав был Царь — массив, единственно полезная структура данных.
                    Ответить
                  • Ну и ещё неюзабельный wchar_t с неизвестным размером и пучок юникодных чаров от 8 до 32 бит. Слава богу, что у них нет signed и unsigned версий.
                    Ответить
                • чем char отличается от signed char?
                  Ответить
                  • показать все, что скрытоvanished
                    Ответить
                    • Это верно, но в сишке есть signed char, unsigned char и просто char.

                      Для арифметики просто char может быть signed или unsigned, в зависимости от компилятора (или в зависимости от ключиков компилятора), но у него есть одно отличие и от signed, и от unsigned: он как-то по-другому работает с указателями.
                      Ответить
                      • показать все, что скрытоvanished
                        Ответить
                      • > но у него есть одно отличие и от signed, и от unsigned: он как-то по-другому работает с указателями.

                        Вообще-то нет. https://govnokod.ru/26318#comment519631
                        Эти вариации char работают с указателями совершенно одинаковым образом
                        Ответить
                        • char * (который без signed/unsigned) особенный.

                          Strict aliasing is the requirement from C99 that an object be accessed only by its own type or by char.

                          C99 6.5 7:
                          An object shall have its stored value accessed only by an lvalue expression that has one of the following types:
                          — a type compatible with the effective type of the object,
                          — a qualified version of a type compatible with the effective type of the object,
                          — a type that is the signed or unsigned type corresponding to the effective type of the object,
                          — a type that is the signed or unsigned type corresponding to a qualified version of the effective type of the object,
                          — an aggregate or union type that includes one of the aforementioned types among its members (including, recursively, a member of a subaggregate or contained union), or
                          — a character type.
                          Ответить
                          • > char * (который без signed/unsigned) особенный.
                            Нет. Все эти три хуйни - character types
                            § 6.2.5, 3
                            > The three types char, signed char, and unsigned char are collectively called the character types.
                            Ответить
                    • а «int»?
                      Ответить
                      • А вот инт тупо знаковый и ничем от signed int не отличается.
                        Ответить
                • Надо уже в язык вставлять зожатия. Программист говорит:
                  zozhac char as unsigned char;
                  zozhac signed * as twos complement;
                  zozhac quiet NaN as signalling NaN;
                  zozhac operator < (signed * a, unsigned * b) as a < 0 || (unsigned *)a < b;

                  И у него char работает как надо, знаковые работают как надо без проблем при переполнении, при получении NaN программу пучит, сравнение чисел тоже работает.
                  Ответить
                • Не чара, а чарЫ. Очарование крестов сажает на острую бутылочку хуёвой реальности.
                  Ответить
    • https://vector-of-bool.github.io/2019/10/07/modules-3.html#a-new-preprocessor-directive
      > C++ Modules introduces an exciting new preprocessor directive! Bet you weren’t expecting that, eh? After all, Modules are supposed to negate some uses of the preprocessor, right?

      Какой багор)))
      Ответить
      • Совершенно не удивлён. Попытка натянуть такую сложную сову, как система модулей, на огромных размеров глобус из говна и костылей ничем иным закончиться не могла. Размууется, получился классический цэпэпэ-вей: нахуевертить огромную систему, придумать под неё сотню-другую новых терминов, продырявить все обсракции, которые только можно, и в конце-концов просто вывалить программистам все-все кишки этой системы — нате, разбирайтесь.
        Ответить
        • > module linkage
          > header-unit import
          > lexical translation phases
          > importable-headers
          > Global Module Fragment
          > module-declaration
          > only preprocessor directives may appear in the global fragment
          > decl-reachable
          > dependent expression
          > first phase of name-lookup

          Сука, какого хуя? Ладно бы это были просто подробности для разработчиков компиляторов и любознательных людей, а обычные программисты могли писать «import zaebis_maker;» и течь — нет, хуй там плавал! Без знаний фаз, ебать их в сраку, лексической трансляции кода, определения отношения decl-reachable (оно, кстати, транзитивно!) и прочей хуйни невозможно узнать, почему простой, понятный и логичный код отваливается с невразумительной ошибкой:
          // foo.hpp
          template <typename T>
          void do_something(T val) {
              // ...
          }
          
          // ...
          module;
          #include "foo.hpp"
          export module acme;
          
          template <typename T>
          export void frombulate(T item) {
              do_something(item);
          
          // main.cpp
          import acme;
          
          int main() {
              frombulate(42); // ERROR: No matching overload of `do_something`!
          }
          }
          Ответить
        • показать все, что скрытоvanished
          Ответить
        • Может, реально хотят выбросить этот язык, но чтобы не вышло как с py2, портят его плавно.
          Ответить
    • показать все, что скрытоvanished
      Ответить
    • Акулина Ивановна. Нету разрыв-травы! Что ты скажешь! (Видит Кикимору.) Чикири!

      Кикимора. Рикичик!

      Бросаются в объятья друг другу.

      Акулина Ивановна. Ишь-мышь?

      Кикимора. Ишь-мышь-перемышь!

      Катя. Невежливо говорить на иностранном языке, если другие не понимают!

      Акулина Ивановна. Не перебивай, когда старшие разговаривают! (Кикиморе.) Чучурик?

      Кикимора. Кочарыг!

      Катя. Забирайте вашу книжку, а я пойду, если так!

      Акулина Ивановна. Ты не обижайся. Это же моя родственница. Семиюродная сестра. Мы с тобой, Кики, сколько лет не видались?

      Кикимора. Не то шестнадцать, не то триста пять. Точно не помню.

      Акулина Ивановна. Василиса здесь?

      Кикимора. А где ж ей быть? До чего заколдована, прямо не знаю, до чего! (Шепчет Акулине Ивановне на ухо. Та отвечает тоже шёпотом.)

      Катя (совсем обиделась). Это нечестно. Я Василисину траву принесла, я волшебную книжку нашла, я вам помогаю, а вы нарочно шепчетесь, чтобы я не понимала! Как вам не стыдно!

      Акулина Ивановна. Прости, пожалуйста. Триста лет не говорила по-тарабарски. Ну, сначала она про свой бант лопотала, потом про родных-знакомых. Она говорит: в чулане Василиса. А я говорю: во дворец как попасть?

      Нина Гернет. Катя и чудеса.
      Ответить
      • показать все, что скрытоvanished
        Ответить
        • И правда...

          Про «Катю и чудеса» я узнал благодаря фильму «Весёлое волшебство» (Киностудия им. М. Горького, 1969). Мне в том фильме понравился интерьер: школа в бывших монастырских постройках.
          Ответить
        • „Когда же она дошла до нильского крокодила и узнала, что «встречаются экземпляры, достигающие десяти метров», она захлопнула книжку. С нее было довольно.

          Тут же ночью она схватила сантиметр и нервно измерила длину комнаты. Ей пришлось выйти в коридор и уткнуться в его противоположную стенку, и то оказалось всего шесть метров семьдесят сантиметров.

          — Значит, кончится тем, что он сломает стенку и всунет хвост в чужую квартиру! Согрели змею на своей груди… — горько сказала мама.

          Всю ночь она не спала, а на утро потребовала, чтобы крокодила не было.

          И хотя Митя с Бремом в руках доказывал, что сам ученый считает эту цифру — десять метров — преувеличенной, мама утверждала, что, если бы это была неправда, Брем об этом не писал бы.

          Когда же Митя прочел вслух, что крокодил достигает таких размеров только через сто лет, мама заявила, что это дореволюционное издание и что Брем устарел.
          Ответить

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