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

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
struct X {
    int x;
    int y;

    X(int y_) :
        y(y_),
        x(y + 10)
    {
    }
};

int main()
{
    X foo = X(16);
    std::cout << "foo == (" << foo.x << ", " << foo.y << ")" << std::endl;
}

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

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

  • Удачняй отладки!
    ☆*:.。.o(≧▽≦)o.。.:*☆

    gcc и clang выдают ворнинг, MSVC — молчит.
    Ответить
        • > /w15038
          Говнокод справочный

          > на самом деле /Wall наверное тоже сработает
          Wall включает ещё какую-то хуйню, которая срабатывает даже на их стандартную библиотеку. Поэтому оно не особо полезно.
          Ответить
          • я оборачиваю стандартную библиотеку отключением варнингов в них через пуш-попы, а проекты у меня всегда с /Wall.
            Плюс есть дефайн:
            #define _STL_WARNING_LEVEL 3
            Который также отключает варнинги в STL (но вроде ниже 3 уровня нельзя ставить - там еррор кидается)

            Но я юзаю предкомпилированные заголовки, поэтому все инклуды на STL и зависимости у меня в одном месте (а не как у людей по всему коду размазаны всякие string или cstdlib.
            Ответить
      • У них ворнинг ня это (C5038) включается только с /Wall. Но проблема в том, что с /Wall Студия нячинает срать гигантскими количествами ворнингов из стандартных (!) заголовочных файлов, что делает его нясколько няпрактичным.
        Ответить
        • А там разве нет особой директивы для отрубания ворнингов в определенных границах?
          Типа как:
          #pragma GCC diagnostic ignored "-Wuninitialized"
          Ответить
          • Есть. Можно врубить определённый варнинг ключём компилятора, можно вырубить.
            Можно врубить определённый варнинг на определённом участке кода, можно вырубить, можно вернуть на значение по умолчанию...
            Ответить
            • ну вот, можно во всяких там библиотеках поотрубать варнинги такими директивами. А еще можно исходники либы компилировать без /Wall, а всё остальное с /Wall. Или говностудия так не может?
              Ответить
              • Для этого нядо проставить прагмы во всех файлах STL. Ну и Boost, в моём случае.
                Ответить
                • а хотелось бы пометить папочку в проекте как "мой код", и пусть бы студия сама передавала компилятору список файлов для Стены

                  STL и boost я вряд-ли буду править, а свой код я может хочу вылзизать до блеска
                  Ответить
                  • У GCC для этого есть специальные опции, кстати: https://gcc.gnu.org/onlinedocs/cpp/System-Headers.html .
                    > The header files declaring interfaces to the operating system and runtime libraries often cannot be written in strictly conforming C. Therefore, GCC gives code found in system headers special treatment. All warnings, other than those generated by ‘#warning’ (see Diagnostics), are suppressed while GCC is processing a system header.
                    Ответить
                • Можно в настройках сделать чтоб вместо cl.exe вызывалась petushnya.bat которая проверяет путь к файлу, и если это бууст или STL то тогда вызывается cl.exe без /Wall, а иначе вызывается cl.exe c /Wall

                  (перегрузка вызова компилятора)
                  Ответить
                  • не хочется ничего хакать до такой степени руками
                    Ответить
                    • Если это чисто чтоб варнинги прочекать, не вижу в этом хаке такой уж большой проблемы. И вообще, лучше уж стат. анализатором обмазаться, например тем, где единорог радугой блюет
                      Ответить
                      • Я не хочу писать никакой логики проверки путя к фалу на bat. Это ведь даже не sh, это просто говёное говно, которое даже трогать не хочется.

                        Лучше уж тогда PS взять, но хуй знает скока он будет запускаться.

                        И я совсем не уверен, что в cproj можно так легко подменить компилятор на bat файл, и не объебаться при этом с аргументами, их экскейпингом итд, и что после этого любой msbuild мне это всё нормально соберет.

                        На юниксе нормально в Makefile напрограммить, а в студии на винде лучше быть аккуратным.

                        Действительно, лучше прикрутить статанализ типа пиваса (он он платный же)
                        А R# вроде гоняет clang-tidy под капотом (судя по номерам ошибок)
                        Ответить
                        • > Я не хочу писать никакой логики проверки путя к фалу на bat. Это ведь даже не sh, это просто говёное говно, которое даже трогать не хочется.

                          Тоже мне проблема. Можешь на Си или на крестах написать эту логику, и скомпилировать в exe файл. Там нихуя сложного нет, надо тупо вызвать cl.exe с теми же параметрами, но еще добавлять или не добавлять /Wall в зависимости от пути к компилируемому файлу.
                          Ответить
                        • > И я совсем не уверен, что в cproj можно так легко подменить компилятор на bat файл

                          Это ты серьезно? Там правда могут быть проблемы с тем, чтоб вместо вызова компилятора cl.exe эта IDE вызывала хуйню, которую я руками где-то прописал? Как вы таким говном вообще пользуетесь?
                          Ответить
                          • >Это ты серьезно?
                            Скорее, интуитивно. Может быть оно и заведется, но зуб бы я не дал (см выше консёрн с аргументами)

                            Недавно стало можно сувнуть любой компилятор
                            https://devblogs.microsoft.com/cppblog/use-any-c-compiler-with-visual-studio/

                            но я не удивлюсь, если там в коде IDE перечислены все 4 компилятора, а при попытке сунуть туда что-то не то можно словить какое-то говно

                            >Как вы таким говном вообще пользуетесь?
                            Когда пользуешься MS, лучше пользоваться официально документированными плюшками.

                            Пытаться что-то под себя кастомизировать может оказаться себе дороже. ИМХО
                            Ответить
                            • > Недавно стало можно сувнуть любой компилятор
                              > Недавно

                              Пиздец.

                              > Когда пользуешься MS, лучше пользоваться официально документированными плюшками.

                              Поэтому я против MS и их говностудии.
                              Ответить
                              • Ну ты опять смотришь со своей колокольни: если я пишу только под винду, то мне похую совершенно на другие компиляторы.

                                XCode, знаете, тоже на винде не работает, и вижалси не умеет (и я даже не уверен, что он может gcc, бо официально у ябла шланг уже 7 лет как)

                                Хотя я согласен, что средства разработки от MS могли бы быть погибче: программист всё таки не обезьянка
                                Ответить
                                • Даже только под винду можно компилировать не только через компилятор MSVC
                                  Ответить
                                    • > а нахуя

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

                                          Иногда бывают такие библиотеки, которые говнокомпилятор вижуалстудии тупо не собирает или собирает, но получается какая-то багнутая хуйня, и происходит это из-за того, что мелкомягкие не соблюли стандарт, а не из-за каких-то там гнутых экстеншенов или асмовставок в коде той библиотеки. Самый банальный пример - open() в винде для бинарных файлов требует особую хуйню O_BINARY и O_TEXT для текста, в стандарте POSIX https://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html такой хуйни не описано (а в стандарте Си функции open() нет вообще, мелкомягкие могли бы просто не реализовывать ее, если она им так не нравится, но они реализовали, насрав какой-то своей хуйни),и если тупо заюзать либу, которая прямолинейно через open открывает файл и читает некие байтики без всяких там костылей-специально-для-винды, оно обосрется.
                                          Ответить
                                          • > Самый банальный пример - open()

                                            Дык она не open(), а _open() насколько я помню. Так что могут делать что хотят.
                                            Ответить
                                            • > Дык она не open(), а _open() насколько я помню. Так что могут делать что хотят.

                                              Ну оно изначально было у них open() и на это имя оно все еще откликается
                                              https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/open?view=msvc-160

                                              > The Microsoft-implemented POSIX function name open is a deprecated alias for the _open function. By default, it generates Compiler warning (level 3) C4996. The name is deprecated because it doesn't follow the Standard C rules for implementation-specific names. However, the function is still supported.

                                              Т.е. "Да, мы насрали на стандарт в свое время, и теперь мы сделали _open(), но open() все еще поддерживается, мы продолжаем срать на стандарт для обратной совместимости со старым говнокодом"
                                              Ответить
                                          • >либу, которая прямолинейно через open открывает

                                            Разгадка простая: Виндуос НЕ позикс совместимая ОС.
                                            Если ты используешь что-то позиксовое, то на винде будет говно.

                                            Или пиши fopen, который кросс-платфомернный, или на пинде юзай CreateFile
                                            Ответить
                                              • Хорошо.

                                                Во всяком случае именно благодаря ему на макбуке и на сервере с линуксом баш и руби работают примерно одинаково)
                                                Ответить
                                                  • Single UNIX Specification (SUS) — общее название для семейства стандартов, которым должна удовлетворять операционная система, чтобы называться «UNIX» (заглавными буквами). SUS разрабатывается и поддерживается Austin Group на основе предыдущих разработок IEEE и The Open Group. «UNIX» является зарегистрированной торговой маркой организации The Open Group


                                                    Стандарт включает в себя текст стандартов POSIX (IEEE 1003.1) и X/Open Curses, опираясь на стандарт C99 (ISO/IEC 9899:1999).

                                                    Кстати, макось и солярка -- UNIX
                                                    Дистры линукса (мейнстримные во всяк случае) и BSD -- нет
                                                    Оче дорого
                                                    Ответить
                                                    • > SUS

                                                      AMOGUS ;__;

                                                      Жалко, что многие дистры линукса не «Unix». Надеюсь, отойдя от стандартов, там что-нибудь умное придумали.

                                                      Зато там «posix», поэтому программы переносимы на уровне исходного кода, это хорошо 🙂
                                                      Ответить
                                                      • Линукс не отходил от стандартов, просто сертификация стоит дорого, а после изменений придется всё пересертифицировать

                                                        Может какой нить RH с LTS 15 лет может позволить себе это для минобороны США, но у арчей и дебианов денег нет

                                                        Скорее всего, Linux и так почти полностью соответствует SUS, иначе бы много чего не работало
                                                        Ответить
                                                    • какой OTSUS

                                                      > BSD
                                                      это которые юзали формат PDP-7 в XXI веке?

                                                      в сперме был interix но потом его просралли
                                                      Ответить
                                            • > Разгадка простая: Виндуос НЕ позикс совместимая ОС.
                                              > Если ты используешь что-то позиксовое, то на винде будет говно.

                                              Зачем? Вот зачем разрабы винды сделали конкретно вызов open() говном? На-ху-я добавлять эту дрисню с O_BINARY и O_TEXT? Есть вызовы fopen и там есть "wb" "rb", вот через него и читайте текстовую парашу с учетом этой вот "/r/n" хуйни.

                                              Я могу и про другие обсеры сказать, например там wchar_t 16-битный

                                              https://ru.wikipedia.org/wiki/Широкий_символ

                                              > В Windows API тип wchar_t именуется как WCHAR и имеет фиксированный размер 16 бит, что не позволяет кодировать весь набор символов Unicode (больше 1 миллиона). Поэтому нарушается стандарт ANSI/ISO C, который требует, чтобы символьный тип wchar_t поддерживал все представимые в системе символы в одном объекте wchar_t. По сути, в WinAPI под WCHAR подразумевается 2-байтное слово из кодировки UTF-16LE (как тип WORD), поэтому символы с кодами выше FFFF16 кодируются парой WCHAR (так называемые «суррогаты») и всем API-функциям передаётся не количество символов, а размер символьного массива в машинных словах.

                                              Это имеет какое-то отношение к позиксу или не-позиксу?
                                              Ответить
                                              • > например там wchar_t 16-битный

                                                Хуёво быть первопроходцем, да. Тогда все думали, что 16 бит хватит для всех...

                                                Поэтому, когда стандартизаторы юникода досыпали ещё говносимволов, майкрософт оказался между джвух стульев и вынужден был перейти на UTF-16.

                                                З.Ы. Емнип, была где-то статья что майки сами жалеют о том, что завязались на 16 бит и не подумали, что юникод может так разрастись.
                                                Ответить
                                                • > Хуёво быть первопроходцем, да. Тогда все думали, что 16 бит хватит для всех...

                                                  Как-то они очень хуево думали. Сколько там всяких символов в японском-китайском наберется? Уж наверняка больше 65536. А есть еще дохуя всяких других языков.
                                                  Ответить
                                                  • https://lk-magellan.ru/language/kitayskiy-yazyk/skolko-ieroglifov-v-kitajskom-yazyke/

                                                    > Сложно определить точное количество иероглифов в китайском языке. Приведем некоторую статистику:

                                                    > Стандарт грамотности в Китае — это 1500 иероглифов для сельской местности или 2000 иероглифов для городов и для служащих в селе.
                                                    > 3000 иероглифов достаточно для чтения газет и неспециализированных журналов.
                                                    > Словарь иероглифов «Чжунхуа цзыхай» (1994г) издания содержит 85 568 иероглифов
                                                    > Пятое издание «Словаря китайских иероглифов и их вариантов» содержит 106 230 иероглиф

                                                    Как всё сложно. Именно поэтому я за ASCII
                                                    Ответить
                                                    • Всё-таки китайцы полные дебилы со своими иероглифами, которые целиком означают слова.
                                                      Ответить
                                                        • китайцы шопотом не умеют говорить потому что у них Тоновая фанетика ебанутая
                                                          Ответить
                                                          • При этом каждый имбецил, который думает, что разбирается в Китае, списывает это на "особенный менталитет", хотя это следовало бы списывать на обыдление населения из-за коммунизма.
                                                            Ответить
                                              • А вообще -- это всё хуйня. Даже если у тебя в wchar_t входят "все символы", ты один хуй не можешь нормально с ними работать без какого-нибудь ICU. Потому что композитные символы, кобенации эмодзей и т.п.

                                                Тлен и безысходность.
                                                Ответить
                                              • с широким символом они обосрались, потому что когда они навезли WCHAR, наверное wchar_t еще не было

                                                На винде вообще работа с кодировкой ебанутая.
                                                CRT всегда высирает в той кодировке, которая стоит у консоли.
                                                Там как-бы есть юникод, но сломанный.
                                                Ответить
                          • > могут быть проблемы

                            Думаешь кому-то хочется искать, что там надо поправить в этом ебучем xml? Да ещё и с ебучим виндовым ограничением на длину командной строки из-за которого списки файлов идут через файл...

                            Но вообще, существующие анализаторы умеют туда встраиваться. Так что какая-то механика есть.
                            Ответить
                            • cum-and file1 file2 file3 ...
                              на самом деле дерьмовая конвенция для узкого круга зада ч
                              Ответить
              • У Буста же дохрена header-only библиотек или просто куча метушни в заголовочных файлах. А учитывая, как работают заголовочные файлы в C и C++, то проще переключать уровень предупреждений перед включением заголовков.
                Ответить
                • > У Буста же дохрена header-only библиотек

                  А если перед инклудом такой библиотеки отключить /Wall какой-то прагмой, а после инклуда обратно включить, это сработает? Ну типа, чтоб для питушни, нагенереннгой такой-то компилтайм-либой, никакие варнинги не работали
                  Ответить
                • > У Буста же дохрена header-only библиотек

                  А если перед инклудом такой библиотеки отключить /Wall какой-то прагмой, а после инклуда обратно включить, это сработает? Ну типа, чтоб для питушни, нагенереннгой такой-то компилтайм-либой, никакие варнинги не работали
                  Ответить
          • Директива есть, но они не додумались до гццшной фишки про "системные" инклуды. Поэтому эту директиву надо расставлять.
            Ответить
            • > Директива есть, но они не додумались до гццшной фишки про "системные" инклуды.

              Ну это можно скостылить же
              Делаем файл incl_without_warn.h со следующим содержимым
              #pragma вырубить_ненужные_варнинги
              #include HDR
              #pragma вернуть_обратно_варнинги
              #undef HDR


              И можно делать:
              #define HDR <boost/somehuita.hpp>
              #include "incl_without_warn.h"
              
              #define HDR <boost/somehuita_2.hpp>
              #include "incl_without_warn.h"

              И тогда все норм будет.
              Ответить
              • > И тогда все норм будет.

                Да проще тогда в stdafx.h всё "системное" хуйнуть, чем так пердолиться над каждым инклудом...
                Ответить
                • > так пердолиться над каждым инклудом...

                  Это все потому, что сишный макрос не может раскрыться в другой макрос и/или в инклуд. Надо препроцессор патчить.
                  Ответить
        • Для примера: нябольшой пет-проектик ня несколько k строк, из либ только Boost и STL, gcc с -Wall -Wextra -pedantic ня выдаёт никаких варнингов, VS с /W4 — тоже. Но стоит только включить /Wall...
          https://i.imgur.com/hO8x9NQ.png

          И это только после компиляции! Нямножко подождала, IntelliSense ещё добавил: https://i.imgur.com/hlTryEG.png .
          Ответить
  • хе-хе, эту шуточку я уже знаю: поля инициализируются в поряде объявления, а не в порядке их вызова.
    У меня на такое решарпер ругается, и просит их местами поменять
    Ответить
      • И это правильно. КМК, существует 0 причин писать код, в котором порядок декларации полей не совпадает с порядком их инициализации
        Ответить
        • Для тарасоформатирования
          struct Coq {
              int a, b, c, d;
              Coq(int a, int b, int c, int d) 
                  : b(a)
                  , a(a + b)
                  , d(a + b + c)
                  , c(a + b + c + d) {}
          };
          Ответить
        • Для тарасоформатирования
          struct Coq {
              int a, b, c, d;
              Coq(int a, int b, int c, int d) 
                  : b(a)
                  , a(a + b)
                  , d(a + b + c)
                  , c(a + b + c + d) {}
          };
          Ответить
              • А, бля, не заметил отсутствие подчёркивания. Ты бы ещё #define true false припрятал, или русскую c с латинской поменял.
                Ответить
                • Забавно, что есть вот такой вот валидный код, который на глаз почти не отличается:
                  Foo(int x) : x(x) {}
                  Ответить
                    • Вот нахуя они это сделали валидным символом для имён? Жизнь казалась слишком серой и скучной?
                      Ответить
                        • Без этой фичи любой дурак мог просто выучить стандарт и объяснить поведение кода, угу. Теперь же прочитать код -- это отдельное искусство.
                          Ответить
                        • З.Ы. У нас лет 5 в публичном интерфейсе висел класс с русской буквой С посредине. Никто не заметил пока проверку не настроили. Все автодополнением пользовались, видимо.
                          Ответить
              • Тут поле "x" устанавливают равным UB, потому что x на момент установки x еще не установлен?
                Ответить
                • Не, тут происходит UB, потому что x на момент чтения не инициализирован, а x -- не char.
                  Ответить
                  • А char типа инициализируются всегда? Или читать говно оттуда убом не считается?
                    Ответить
                    • Насколько помню, из них просто читается неопределённое значение. Ну иначе memcpy на структурах с паддингом по пизде пойдёт.
                      Ответить
                    • Из чар/байт всегда можно читать, там может быть что угодно, но оно прочтется>

                      А из других структур нельзя.
                      Например если прочитать говно из bool, то можно разрушить случайно true == true
                      Ответить
                      • Даже низя вот так
                        int x;
                        x = x;
                        x = 5;
                        assert(x == 5);

                        ?
                        Ответить
                        • Боюсь, что на второй строчке ты породил UB
                          А после этого уже что угодно может быть
                          Ответить
                        • Конпелятор имеет право выкинуть этот код т.к. он недостижим.
                          Ответить
                          • Конпелятор имеет право выкинуть программиста. Правда, к сожалению, не имеет возможности.
                            Ответить
                            • Вообще говоря нет, иначе ему придётся решить задачу останова, чтобы доказать что программист действительно накосячил в используемом коде при допустимых аргументах.

                              Поэтому выебать программиста он может только в рантайме.
                              Ответить
                              • Учитывая, что при UB не гарантируется ничего даже по отношению к коду выполнявшегося до UB, компилятор может вставить код, посылающий сообщение в прошлое чтобы выпилить программиста до написания программы.
                                Ответить
                  • потому что чар как байт?

                    байт вроде можно читать неинициализированным, просто мусор будет
                    Ответить
                      • виндушок

                        в винде есть
                        typedef unsigned char BYTE;

                        А в крестах нету байта же((
                        Ответить
                          • значит, я не просто так про него спизднул
                            >>17
                            ну понятно

                            а его тоже можно читать неинициализированно?
                            Ответить
                            • typedef не порождает новый тип, к сожалению. А фишка std::byte как раз в том, что это новый тип, отличный от всех числовых. Поэтому у него работают только явно объявленные операторы, а не дефолтная магия чисел.
                              Ответить
  • такой вопрос: почему я могу захотеть musl вместо glibc?
    Ответить
  • Почему у шарпеев есть и интерфейс, и абстрактный класс?
    Ответить
    • А у джавистов почему есть?

      Потому что наследовать можно несколько интерфейсов, а несколько абстрактных классов нельзя.
      Так в джаве, и я на 87% уверен, что так же и в C#
      Ответить
      • Ничего не понял

        Что мешает просто разрешить в интерфейсах статические методы и конструкторы?

        В чём ещё профит в абстрактном классе, кроме как в обходе этих странных ограничений?
        Ответить
        • >Что мешает просто разрешить в интерфейсах статические методы
          ничего не мешает, они там есть

          >и конструкторы
          Придется решать вопрос виртуального/невиртуального наследования

          Pig: Animal
          Dog: Animal
          Svinosobaka: Dog, Pig

          сколько раз вызовется конструктор Animal?

          >В чём ещё профит в абстрактном классе
          В абстрактном классе можно хранить какие-то поля, а в интерфейсе нет.

          Pure abstract класс без полей ничем не отличается от интерфейса, и наверное не нужен

          Интерфейс в C# это, по сути, протокол
          Ответить
                • Вроде бы он есть в 2019 студии, но насколько это работает я не знаю

                  А зачем тебе статичесчкий метод в интерфейсе? Он же там просто как в неймспейсе лежит
                  Ответить
                • Вроде бы он есть в 2019 студии, но насколько это работает я не знаю

                  А зачем тебе статичесчкий метод в интерфейсе? Он же там просто как в неймспейсе лежит
                  Ответить
                  • Надо было обойти кое-какие другие ограничения, пришлось через фабрику
                    Ответить
                  • Надо было обойти кое-какие другие ограничения, пришлось через фабрику
                    Ответить
                    • Ты использовал генерики, и хотел что-то типа

                      var t = T(foo);

                      ?

                      Увы, в C# и java нужно через фабрику (это не кресты)
                      Ответить
                      • Да уж, какие в «java» и «C#» глупые баки-дженерики!

                        Не то, что в «С++» или, например, в «Nim». Смотри, какой няшный дженерик:
                        proc T[T](x: T): T =
                          return x 
                        
                        var t = T(5)
                        var neko = T("Nya")
                        echo $t, $neko
                        
                        // Output: 5Nya
                        Ответить
                        • Сразу видно, что язык назвали в честь еврейского царя: лишний пробел в выводе это дорого!
                          Ответить
                      • в шарпе можно через where T : new() при наличии конструктора без аргументов, что выглядит как-то нинужно
                        Ответить
                        • Попробуй питухон

                          Там совершенно нормально передать куда-то класс, и вызвать у него любой метод, включая конструктор
                          Ответить
                            • 🙂 Ну в Питоне это не вредно, там много чего на этом сделано.

                              Другой вопрос, что переходить с шарпа на питон вряд-ли стоит)
                              Ответить
          • > Придется решать вопрос виртуального/невиртуального наследования
            - в Шарпе-то?

            Ну и в Свифте ж как-то решили
            Ответить
            • Ну да.
              Интерфейс это протокол, это просто обещание "я клянусь иметь такие-то методы"
              В нем нету кода

              Как только в нем появляется код или поля, то сразу начинается масса вопросов

              А в свифте есть множественное наследование?
              Ответить
            • Ну да.
              Интерфейс это протокол, это просто обещание "я клянусь иметь такие-то методы"
              В нем нету кода

              Как только в нем появляется код или поля, то сразу начинается масса вопросов

              А в свифте есть множественное наследование?
              Ответить
              • А что, в Шарпе есть разделение на виртуальные и невиртуальные методы?

                > в свифте есть множественное наследование?
                - нет
                Ответить
                • В C# есть и виртуальные методы, и обычные. См ключ слово virtual.
                  Обычный метод диспатчится статически, и зависит от типа указателя.
                  Виртуальный диспатчится в рантайме, и зависит от реального объекта.
                  (а вот в джавке все методы виртуальные)_

                  Но я не про виртуальные методы, я про виртуальное наследование
                  https://en.wikipedia.org/wiki/Virtual_inheritance

                  Представим, что в у интерфейсов в шарпе есть конструкторы.
                  Ответь на вопрос: сколько раз для примера выше вызовется конструктор Animal?
                  Ответить
                    • Да

                      Класс тут только Svinosobaka
                      И вот я его инстанциировал
                      Ответить
                    • Да

                      Класс тут только Svinosobaka
                      И вот я его инстанциировал
                      Ответить
                        • Значит, наследование виртуальное.
                          А может кто-то захотеть, что бы он вызвался два раза, и создались два Animal (см ссылку про виртуальное и невиртуальное наследование в C++)

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

                          В С++ вместо интерфейсов используются абстрактные классы, которые могут иметь поля, и там возникает еще куча вопросов, например если у Animal есть поле foo, то у Svinosobaka теперь есть два таких поля, и когда ты передаешь свинособаку во что-то, что ождиает Animal, то ты должен явно его скастить в Dog или Pig, иначе компилятор не поймет, какое поле использовать
                          Ответить
                        • Значит, наследование виртуальное.
                          А может кто-то захотеть, что бы он вызвался два раза, и создались два Animal (см ссылку про виртуальное и невиртуальное наследование в C++)

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

                          В С++ вместо интерфейсов используются абстрактные классы, которые могут иметь поля, и там возникает еще куча вопросов, например если у Animal есть поле foo, то у Svinosobaka теперь есть два таких поля, и когда ты передаешь свинособаку во что-то, что ождиает Animal, то ты должен явно его скастить в Dog или Pig, иначе компилятор не поймет, какое поле использовать
                          Ответить
                            • Ну, не я принимал решение об отсутствии конструкторов у интерфейсов, но мне кажется, что они не захотели усложнять систему, чтобы не отвечать потом на такие вот вопросы

                              Так или иначе, конструкторов в interface нет.

                              И даже требовать наличие конструктора они не могут (вроде бы в яблоке можно требовать в протоколе наличие метода init)
                              Ответить
                            • Ну, не я принимал решение об отсутствии конструкторов у интерфейсов, но мне кажется, что они не захотели усложнять систему, чтобы не отвечать потом на такие вот вопросы

                              Так или иначе, конструкторов в interface нет.

                              И даже требовать наличие конструктора они не могут (вроде бы в яблоке можно требовать в протоколе наличие метода init)
                              Ответить
                              • Кто может требовать в протоколе наличие метода? Ну кроме злого лида
                                Ответить
                                • Имелось ввиду "в протоколе я могу прописать требование о наличии метода init в реализующем его классе, и если он его не реализует, то не компилится"
                                  так же вроде
                                  Ответить
                              • > такие вот вопросы

                                - я так до конца не понял, какие вопросы, ведь интерфейс это просто контракт и, как ты сам и заметил, никакого кода не содержит
                                Ответить
                                • Если бы в интерфейсе был конструктор (с кодом) то возник бы вопрос с виртуальным наследованием

                                  А вот почему в интерфейсе нельзя определить конструткор без кода (то есть потребовать от реализующего его класса такой конструктор) я не знаю
                                  Ответить
                                • Если бы в интерфейсе был конструктор (с кодом) то возник бы вопрос с виртуальным наследованием

                                  А вот почему в интерфейсе нельзя определить конструткор без кода (то есть потребовать от реализующего его класса такой конструктор) я не знаю
                                  Ответить
                                  • > почему в интерфейсе нельзя определить конструткор без кода

                                    Потому что с травкой пора завязывать...

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

                                      а что тут не так?
                                      Ответить
                                      • Интерфейсы — костыль для языков со статической тупизацией, чтобы функция могла принимать объекты классов созданных после, не навязывая им при этом конкретную реализацию. Как правило, конструкторы у существующих объектах не вызываются. ЧСХ, как только в языке появляется утиная тупизация в каком-либо виде, вся поддержка интерфейсов на уровне языка заканчивается. За исключением ПХП, потому что ПХП — особенный.
                                        Ответить
                                        • Есть такая болезнь, когда люди тащат домой всякий ненужный хлам, совершенно не понимая зачем он им нужен.

                                          PHP поступает точно также
                                          Ответить
                                        • внезапно интерфейсы и утиная типизация это про одно и то же
                                          Ответить
  • Питон по мне довольно сложный ЯП, отчасти даже по сложней С/С++, легкий, это например Lua. Я во обще питон называю питухон, какой-то не логичный ЯП, непонятно зачем он нужен.
    Веб-программирования, тут я тоже скажу, это не особо интересно, лично мне это совсем не интересно, хотя иногда приходится разбираться HTML.
    А вот программирования игр это интересно, можно начать с программирования несложных игр с помощью всяких конструкторов. Ну или программирования модов, я например увлекаюсь С.Т.А.Л.К.Е.Р.ом, в результате освоил более или менее ассемблер, потом по хуже С++, ну и конечно Lua.
    В общем, у каждого свой путь!

    https://habr.com/ru/company/habr/blog/435562/#comment_19638102

    Тот же крендель

    По мне Си плох тем, что слишком высокоуровневый.
    Не хватает ЯП занимающий промежуточное место между С/С++ и ассемблером.
    https://habr.com/ru/company/vdsina/blog/532416/#comment_22428200

    И еще немного

    Хорошо когда IDE может подсвечивать одинаковые слова, при выделении одного из них, как это делается в Notepad++, не все IDE это могут делать, из-за этого приходится открывать один и тот же файл и VS2010 и Notepad++
    https://habr.com/ru/company/pvs-studio/blog/488332/#comment_21279542

    ну и лучшее
    Можно на С++ писать так, как на ассемблере, т.е. по возможности без лишней абстракции, ну примитивные данные быстрей обрабатываются.
    https://habr.com/en/post/484688/#comment_21191180
    Ответить
    • Попрошу заметить, что на говнокоде такие не сидят, а сидят такие на Хабре.

      Ему ещё и плюсы лепят! )))
      Ответить
      • Да.

        Вообще он прекрасен. Например вот:

        А во обще странно, почему тормозит. Я недавно тестировал компиляторы VS C++ 2010 и VS C++ 2017, да к новый компилятор генерирует более оптимальный код, 5-10% можно получить быстродействия, и это простой перекомпиляцией. Ну а если вдруг проект стал тормозить значит, значит к проекту прилипла что-то тормозящие, в смысле библиотека.

        ---
        или вот
        А то я в последнее время приобрёл привычку сжимать исходник, чтобы колёсико мышки меньше изнашивалось.
        Раньше делал так:

        if(condition)
        {
            code
        }
        else
        {
            code
        }



        а теперь делаю так
        if(condition){
            code
        }else{
            code
        }


        -----
        Без матана конечно можно, но например программисту лучше всё же его знать. Программирование это прежде всего логика, математика уже вторична
        ----
        Ответить
        • А самое главное, он ведь во всём прав!

          Кстати, в «Nim» исходники получаются меньше чем в Сисюке, т.к. там нет фигурных скобок, поэтому колёсико мыши меньше изнашивается. Ещё одна причина перейти на «Nim».
          Ответить
          • мне без скобок плохо, в vi не работает "%"
            Потому я страдаю в питухоне

            Кстати, в руби между бегинами и ендами скачет норм
            Ответить
              • % прыгает между скобками парными

                Положим, ты хочешь выделить тело функции.
                Ты ставишь каретку на {, жмешь V%, и выделяешь всё до конца функции
                Ответить
                • Ого... Это пиздец! А зачем такое нужно? Во сколько раз твоя эффективность повышается из-за этой функции? Как часто ты её используешь? Сколько времени в день ты экономить, пользуясь "%"? А в год?

                  Кстати, для питона есть такое:

                  https://vi.stackexchange.com/questions/7262/end-of-python-block-motion

                  Тебе не подойдёт?
                  Ответить
                  • очень нужно. Я так и по файлу навигируюсь, и комментирую куски кода, и форматирую его для удобства

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

                      А ещё есть такая штучка в емаксе, она показывает какие в файле есть функции, классы и т.п., можно там тыкать и прыгать к дефиниции. Правда, я не знаю, как это включить в питоне и «Nim» (((
                      Ответить
                      • >Я пишу достаточно короткие и лаконичные функции меньше двух-трёх экранов

                        ты же не только с кодом который сам написал работаешь

                        говна на тыщи строк встречаются в любом проекте старше 5 лет думаю
                        Ответить
                        • Такие функции тем более лучше не выделять, а то случайно удалишь и рефлекторно сохранишь. И будет пиздец)
                          Ответить
                          • Восстановишь из гита. А если там и гитом не пользуются... что ж, будет повод переписать всё нормально.
                            Ответить
                          • >а то случайно удалишь и рефлекторно сохранишь

                            Это просто значит что функция не прошла естественный отбор
                            Ответить
    • > Хорошо когда IDE может подсвечивать одинаковые слова, при выделении одного из них, как это делается в Notepad++, не все IDE это могут делать, из-за этого приходится открывать один и тот же файл и VS2010 и Notepad++

      Чем бы мне ни заниматься, лишь бы только с емаксом не ебаться?
      Ответить

Добавить комментарий для MAKAKA Отменить ответ

Я, guest, находясь в здравом уме и твердой памяти, торжественно заявляю:

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


    8