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

    +19

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    struct BufInfo 
    {
    	const tbal::Bitmap &src, &dst;
    	int y1, y2;
    	BufInfo (const tbal::Bitmap &scr, const tbal::Bitmap &dst, int y1, int y2) : src(src), dst(dst), y1(y1), y2(y2) {}
    };

    Как можно проебать час жизни...

    Запостил: TarasB, 20 Марта 2013

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

    • о боже, какая длинная строчка, ты уже перестал кодить на "Лунтике" и прикупил нормальный монитор?
      http://static.ozone.ru/multimedia/toys/1001361793.jpg
      Ответить
    • я правильно понимаю, что весь "смак" в
      > ...src(src), dst(dst)... ?
      Ответить
      • да, тарас грязный хаккер и пользуется тем, что даже ссылки можно инициализировать самими собой
        Ответить
        • Ну не знаю у меня такой джигурды не выходит аргументы и члены класса распознаются коректно хотя на лицо пересечение областей видимости
          http://ideone.com/hO6024
          Ответить
          • > аргументы и члены класса распознаются коректно
            Так у тебя то все корректно написано. А у Тараса вот так: http://ideone.com/K98dNU

            А логика в этой конструкции очень простая - локальные переменные всегда просматриваются первыми, поэтому a(a) это локальная переменная. Но т.к. в списке инициализации нет смысла инициализировать локалки, поэтому a(a) это член класса.
            Ответить
        • > ссылки можно инициализировать самими собой
          Более того, у меня как-то раз получалась примерно вот такая ситуация: https://ideone.com/HGKwQA.
          Ответить
          • я про ссылки не зря вспомнил - их инициализировать надо всегда, должна она хранить значение или нет
            и вместо того, чтобы взять указатель вместо ссылки (он то как раз позволяет и nullptr, и нормальный адрес), можно ведь проявить интеллект и в конструкторе ссылку проинициализировать самой собой - показать кто тут главный какир
            struct foo {
               // normand ctor
               foo(bar & b): b_(b), is_good_(true) {}
               // speшial ctor - magic here
               foo(): b_(b_), is_good_(false) {}
               bar & b_;
               bool is_good_;
            };
            Ответить
            • А это не UB?
              Ответить
              • Презумпция виновности: поведение любой с++ программы не определено, пока не доказано обратного?
                Ответить
              • Certainly UB, just as planned. Reference point to unknown address, but we know about this, not use it and have cool-hacker's poker-face.
                Ответить
              • 8.3.2 References
                A reference shall be initialized to refer to a valid object or function. [Note: in particular, a null reference cannot exist in a well-defined program, because the only way to create such a reference would be to bind it to the “object” obtained by dereferencing a null pointer, which causes undefined behavior.]

                Так что UB.
                Ответить
                • > A reference shall be initialized to refer to a valid object or function
                  > shall be
                  Ответить
                  • > shall be
                    in a well-defined program of course ;)

                    Two beer or not to bee.
                    Ответить
      • Смак в том, что он опечатался в имени первого аргумента конструктора, и в результате ссылка оказалась инициализирована не им, а своим же неопределённым значением.
        Ответить
        • Смак в том, что я час проебал, пытаясь понять, где я неправильно передал аргументы через void* в поточную функцию, при этом из средств отладки - только логи. Через час наконец я в логах увидел, что второй аргумент не такой, какой надо и после этого уже, побуквенно глядя на код, нашёл опечатку, о которой промолчал ГЦЦ.
          Проверить под виндой я не мог, потому что в виндоблядской студии херово с библиотекой pthread.h

          Кстати, я правильно понимаю, что pthread_join, которая ждёт завершения работы потока, корректно освобождает все ресурсы, связанные с этим потоком?
          Ответить
          • Поэтому поля и аргументы конструктура обычно называют разными именами.
            Ответить
          • нужно больше нативного мусора в проэкте
            Ответить
            • 1. Нужно меньше жабьего мусора.
              2. Это не проэкт, это таки проект.
              Ответить
          • > о которой промолчал ГЦЦ
            Да ну? warning: unused parameter ‘scr’ [-Wunused-parameter]

            Собственно единственное место, в котором этот ворнинг оказывается полезным. Обычно, когда юзаешь много виртуальных функций, он только бесит.
            Ответить
            • сделей макрос как в Qt
              #define UNUSED(v) ((void)v)


              UPD: для некоторых компиляторов макрос определяется через пустую функцию
              Ответить
              • новенький штоле?
                Ответить
              • >для некоторых компиляторов макрос определяется через пустую функцию
                Borland C++ Builder?

                Bormand and Taras use latent sarcasm mode. You shouldn't answer to they questions.
                Ответить
            • На тех настройках, которые идут в НДК по умоланию, и которые меняются только через глубокую жопу, его нет.
              Ответить
              • Попробуй добавить LOCAL_CPPFLAGS += -Wall -Wextra и LOCAL_CFLAGS += -Wall -Wextra в Android.mk.

                P.S. You should define some of them between an 'include $(CLEAR_VARS)' and an 'include $(BUILD_XXXXX)'
                Ответить
                • -Wall -Wextra - it is minimal flags for minimal warnings-level, that I used at ever time. Usually I use many other flags, that level up warnings-level.
                  Ответить
          • >что второй аргумент не такой, какой надо
            Сползаешь потихоньку в болото крестоблядства.
            >потому что в виндоблядской студии херово с библиотекой pthread.h
            Удали её. Просто сотри нахуй. Или настрой нормально.
            Тот же эклипс должен был тебе показать unused.
            Ответить
          • Кстати поискал сегодня этот баг на багтрекере гцц. Первый репорт был в районе 2004 года, пофиксили в gcc 4.7.0 в 2011. Пишут, что в 4.7+ должен ругаться на инициализацию переменной самой собой.
            Ответить
      • Не, так как раз можно делать.
        Ответить
    • Блядь. Ворнинги надо включать, первым делом, когда начинаешь новый прожэкт и пишешь makefile. Это даже я знаю.
      Тогда кресты на всё неявное и подозрительное ругаются не хуже твоего пасцаля.
      http://stackoverflow.com/questions/154630/recommended-gcc-warning-options-for-c
      Ответить
    • -Wconversion -Wsign-compare
      Вот эти 2 на мой взгляд важные. Именно для строгой типизации.
      Помню когда-то -Wextra мне не включал их.

      А всякие долбоёбы отключают все ворнинги, и потом бегут на говнокод:
      "Смотрите, посоны, оно у меня компилицо. Кресты - говнище"
      Только они не знают/забывают что там пачка ворнингов идёт.
      Ответить
      • Про сравнение знакового и беззнакового вроде выдает на экстре, если мне память не изменяет. Причем там ворнинг умно сделан, не ругается, если знаковое шире беззнакового. А насчет конвершена хоть убей, не помню.
        Ответить
      • > Только они не знают/забывают что там пачка ворнингов идёт
        На ворны надейся, а сам не плошай. Граблей, на которые при всем желании не получится сгенерить ворнинг в крестах хватает. Хотя с другой стороны о типичных ошибках почти всегда предупреждает.

        P.S. wall и wextra это необходимый минимум, когда уже все начинающие сишко- и крестописцы это выучат...

        А еще я за включение опций, заставляющих компилятор юзать конкретный стандарт. Дабы не залететь потом, случайно поюзав какое-нибудь визуалкоблядство или гццизм.
        Ответить
    • КРЕСТОПРОБЛЕМЫ.
      Ответить

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