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

    Комментарии (129) 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 возвращают указатель на начало буфера?
          Ответить
        • а как передать массив по значению? а вернуть как?
          Ответить
          • 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!
              Ответить
            • ну есть же такая точка зреня, что не надо всё мешать в один язык

              20% программы занимают 80% времени. Берешь, и переписываешь их на сишечку и ебешься с лоу-левел царскими опмтизациями под конкретную архитектуру.

              Остальное пишешь, не знаю, на руби например. С высокоуровневой питушней, функциональщиной, DSLями и литерейт программинг
              Ответить
            • Полностью поддерживаю. Однако, препроцессора и шаблонов очень не хватает в каких-нибудь ЯВУтухах. Неясно, почему в мире высокого уровня негласно считается зашкваром параметризовать код и скомпилировать его сразу как надо, а не подставлять параметры в рантайме.
              Ответить
              • Преждевременная оптимизация потому что.

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

                    джава вообще днище

                    но мой любимый пример, когда класс параметризируется родителем, все равно нигде не работает

                    нельзя же 'class Foo<T>: T"
                    Ответить
                    • > мой любимый пример, когда класс параметризируется родителем
                      Мой любимый пример - когда класс-родитель параметризируется ребёнком.
                      Ответить
                      • Вроде как говнокод, когда папа знает про детей.
                        С другой стороны, sealed classes (енумы-на-стероидах) в котлине так работают
                        Ответить
                        • Фактически он ничего особенного о них не знает.

                          Вообще, если подумать, можно вообще всё ООП в C++ очернить. Допустим, если класс не final, то он знает, какие методы будут у его детей.
                          Ответить
                          • > знает, какие методы будут у его детей
                            Это как?
                            Ответить
                            • Если от класса можно унаследоваться, дети получат его публичные методы в свой интерфейс.
                              public:
                                 infa_sotka children_inherit_this_one();
                              Ответить
                              • infa_sotka children_inherit_this_one(){
                                    throw NotSupportedException();
                                }
                                Ответить
                                • Похоже на детали реализации.
                                  Ответить
                                • обожаю это дирьмо

                                  реализовать интерфейс, чтобы кинуть NotSupportedException

                                  Мы с Барбарой Лискоу таких программистов ебём
                                  Ответить
                          • Не важно, какие методы. Главное, чтобы никто не трогал его методы.
                            А если его мтеоды виртуальны, то конечно он ничего не знает об их реализации, и это говно. Потому я против наследования классов с виртуальными методами
                            Ответить
                      • > когда класс-родитель параметризируется ребёнком
                        Какой «Curiously recurring template pattern» )))
                        Ответить
            • Сишка — слаботипизированный язык.
              Под любой примитивной абстракцией (будь-то bool, char, enum) скрывается обычный int. Который хуй пойми что и равен размеру регистра.

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

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

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

                Угу, у крестов три разных чара (char, signed char и unsigned char - разные типы) а не два, как у сишки. Прогресс, блджад.
                Ответить
                • зато больше разных кастов
                  Ответить
                  • Мне из них больше всего boost::lexical_cast нравится. Просто мечта PHP'шника.
                    Ответить
                • Хмм, по-моему в Си тоже три разных чара
                  Ответить
                  • сайнд ансайнд и просто
                    Ответить
                  • В сишке это не принципиально, перегрузок всё равно нет и отличить их друг от друга невозможно. В крестах же это реально 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 версий.
                    Ответить
                    • если тебе не важен размер -- он очень даже юзабелен
                      Ответить
                      • > если тебе не важен размер

                        Если мне настолько похуй на представление строки, то и utf-8 в обычных чарах сойдёт.
                        Ответить
                        • не понял как оно сойдет

                          char* foo = "Ελλάδα Греция"
                          pintf("%s", foo)

                          разве не отсосет?
                          Ответить
                          • Ну это настолько же implementation defined, насколько и wchar_t. Но обычно работает.
                            Ответить
                            • кажется что на пинде не сработает
                              а на прыще -- да
                              Ответить
                              • Переключи сосноль на utf-8 и сработает.

                                В общем-то эта свистопляска с wchar_t и отдельным "юникодным" API - огромный фейл, имхо. MS думало, что 16 бит хватит для всех и можно будет реально работать с элементами строки как с символами. Но юникод вырос и обосрал всю эту затею. А делать ещё одно API с 32-битными символами они уже не решились.
                                Ответить
                                • нет сейчас пинды под рукой, то считаю, что не сработает, потому что print (не wprint) всегда принимает однобайтовую кодировку (кодировку сосноли) в пинде

                                  chcp 65001 работает как-то через жпу, проверь.

                                  у MS еще веселеее все: у них есть TEXT, и в зависимости от опций компилятора он будет ансишным или уникодным

                                  зы: какой бугор
                                  https://dev.to/mattn/please-stop-hack-chcp-65001-27db

                                  Короче, в пинде надо писать через ConsoleApi
                                  Ответить
                                  • Ну TCHAR'ы никто в здравом уме не юзает.
                                    Ответить
                                    • а тогда как правильно?
                                      кажется что wchar правильнее charа, и семантически вернее

                                      TCHARы нужны для переноса на win98, где ansi, да?
                                      Ответить
                                      • Эскобар.чпг

                                        Юникод настолько засрали всякими композитными символами и комбо-смайликами, что без специальных либ с ним не поработать даже в char32_t. Т.е. представление строки для программиста не имеет никакого значения, лишь бы либы хавали.
                                        Ответить
                                        • ну положим смайлики мне не нужны, нужны обычные плейны с европейскими языками

                                          Кажется что код с wchar будет максимально переносимым
                                          Ответить
                                          • > будет максимально переносимым

                                            А потом твою прогу купят какие-нибудь арабы...

                                            Максимально переносим какой-нибудь QString, который полностью скрывает все детали своей реализации и может конвертиться хоть в wchar_t хоть в char в нужной кодировке. Ну и даёт доступ к символам кодепоинтам как QChar/char32_t (и то тут встаёт вопрос о нормализации всяких ё).
                                            Ответить
                                            • С арабами я один хуй обосрусь, потому что моя прога не будет уметь спрва налево.

                                              Но могу обосраться с тихоокеанским регионом.

                                              Короче, на голой сишечке красиво не сделть: надо брать QT, да?
                                              Ответить
                                  • > ConsoleApi

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

                                        софт должен быть на английском
                                        он везде работает
                                        любители "виртуальных диспетчеров брандмауэров узловой безопасности" должны сосать by design
                                        Ответить
                      • Ну и плавающий размер не даёт юзать wchar_t для транспорта строк. Т.е. для записи в файлы или сокеты тебе один хер его надо будет перевести в байты в какой-то кодировке. utf-8 же просто байтики и всегда готов к передаче или сохранению, хоть и чуть-чуть медленее в посимвольной обработке.
                        Ответить
                        • правильно, потому что на другой стороне размер wchar может быть иным

                          но разве это не справедливо для всех типов?
                          Ответить
                    • Ответить
                • чем char отличается от signed char?
                  Ответить
                  • char может быть как знаковым, так и беззнаковым, зависит от реализации
                    Ответить
                    • Это верно, но в сишке есть signed char, unsigned char и просто char.

                      Для арифметики просто char может быть signed или unsigned, в зависимости от компилятора (или в зависимости от ключиков компилятора), но у него есть одно отличие и от signed, и от unsigned: он как-то по-другому работает с указателями.
                      Ответить
                      • >он как-то по-другому работает с указателями.
                        что?
                        Ответить
                        • Мне каждый раз приходится это гуглить заново. Я помню, что нужно гуглить по ключевой фразе «strict aliasing».
                          Ответить
                          • а, выравнивание там разное может быть

                            нельзя к чару обращаться через указатель а другой тип?
                            Ответить
                      • > но у него есть одно отличие и от 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`!
          }
          }
          Ответить
        • жаль, что не увеличилось количество *value.

          Хочу чтобы были xbgdfvalue, rvgxvalue, zdevalue и zdgxvalue
          Ответить
          • А я хочу, чтобы появились rgbvalue, cmykvalue и hslvalue.
            Ответить
            • shadesofgrayvalue

              лядь, я про передачу цвета, а не про то, что вы подумали
              Ответить
              • Ещё можно ввести upvalue, downvalue, strangevalue, charmedvalue, bottomvalue, topvalue.

                https://ru.wikipedia.org/w/?curid=5269
                Ответить
                • почему ровно три цвета?
                  почему ровно три поколения кварков?
                  случайно ли совпадение числа цветов и числа поколений?
                  случайно ли совпадение этого числа с размерностью пространства в нашем мире?


                  Так ведь Бог троицкого любит, это же известно
                  Ответить
            • А я хочу mfnahfnahfnahfnah.
              Ответить
              • Ikirundi n’ikinyarwanda bisa nk’igi czek n’igi slovak
                Ответить
                • Сразу видно, что это какой-то из языков банту.

                  «Iki-» похоже на префикс класса («венгерка»), как, например, «Ki-» в «Kiswahili» (самоназвание «суахили»).
                  Ответить
        • Может, реально хотят выбросить этот язык, но чтобы не вышло как с py2, портят его плавно.
          Ответить
    • почему так много людей читает одну и ту же книжку?
      https://hsto.org/getpro/tmtm/articles/tld/images/10455744/tild3763-3964-4664-a437-616437626439__3y7a6377.jpg
      Ответить
    • Акулина Ивановна. Нету разрыв-травы! Что ты скажешь! (Видит Кикимору.) Чикири!

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

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

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

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

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

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

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

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

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

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

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

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

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

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

      Нина Гернет. Катя и чудеса.
      Ответить
      • А еще у нее есть книга Катя и Крокодил

        [место для шутки про трип]
        Ответить
        • И правда...

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

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

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

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

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

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

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