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

    +11

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    typedef void Start1(void);
    struct Kernel
    {
        Start1 Start;
    } kernel;
     
    void Kernel::Start(void)
    {
     
    }

    Как всегда оттуда.

    Запостил: LispGovno, 06 Ноября 2012

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

    • Не нашел тему, где Тарас хвалился говнокодом. Так что ждем его.
      http://ideone.com/sZgRua
      Ответить
      • Имхо вредно неоперившимся говнокодерам давать такие возможности.
        Ответить
        • зато сколько простора для творчества
          Ответить
        • Надо их на брейнфайк сажать.

          Через месяц дать ассемблер - они офигеют как всё удобно и будут использовать его возможности по назначению.

          Ещё через месяц дать сишку - они опять офигеют как всё удобно и будут писать очень красивый код.

          Ещё через месяц - Java - они опять офигеют и начнут писать заебись какие крутые паттерны и даже свои придумают.
          Ответить
    • Это не крестоблядство, это крестопринципы.
      Ответить
    • на самом деле может кто-нибудь объяснит сакраментальную пользу вот этого крестоговна (пример в 2003 стандарте 8.3.5/9)?
      int a, *b, c(), *d(), (*e)(), (*f())();
      неужели подобной поеботой (c, d, f) кто-то пользуется?
      Ответить
      • Массив и функция возвращающая ссылку на этот массив забыл. Притом все в одном выражении.
        Ответить
      • int a, *b=&a, &c=a;

        Элсо так я делал.
        Ответить
        • я ведь отметил те "декларации", которые возмущают
          просто пример взят фактически из документа стандарта
          т.е. они этим как бы хвалятся
          Ответить
          • Блин, да нормальная это возможность. Раз сишка позволяла это (была настолько перегруженннной), то не отставать же от неё крестам.
            Ответить
            • ну просто у меня всё еще теплится надежда, что это может на самом деле киллер-фича
              а я чего-то не догоняю
              и что в сишке это нереально решало
              и что мне покажут пример, где это на самом деле пригождается
              ну типа че париться
              надо быть узнаваемым в толпе, отличный стиль, например - http://ideone.com/LJzWgO
              Ответить
              • // POSIX, <signal.h>
                void (*signal(int sig, void (*func)(int)))(int);
                Ответить
                • не-не-не, дейвид блейн
                  int main() {
                      void * a, **b, (*signal(int sig, void (*func)(int)))(int), **d = &a;
                  }
                  вот так пример выглядит лучше
                  Ответить
                  • И весь оставшийся код через запятую...
                    Ответить
                  • void * a, **d = &a;
                    Кстати так тоже писал. А вот тому сигналу что-нибудь присвоить можно в этой строке? Не определюсь куда = вставить.
                    Ответить
                    • вставить комитетчикам в то место, каким они протаскивают уже 30 лет по стандартам это говно
                      Ответить
                    • Нельзя. Это прототип. Его следует реализовать ниже по коду, или же его реализация должна оказаться в другом модуле.
                      Ответить
                      • >Это прототип.
                        А если этот прототип превратить в указатель, то куда надо вставить?
                        Ответить
                        • В анус тому кто придумал такие формы записи.
                          void * a, **b, (*signal(int sig, void (*(*func))(int)))(int), **d = &a;

                          Вот так по идее.
                          Ответить
                          • >Вот так по идее.
                            А где присвоение этому указателю написать?
                            Ответить
                            • Я зафейлил. Второпях не туда скобки захерачил. Минусуйте мой пост выше.

                              http://ideone.com/MEHOcp

                              P.S. Дефекейт++ постом ниже прав.
                              Ответить
                              • void * a, **b, (*(*signal2=f)(int sig, void (*func)(int)))(int), **d = &a;

                                То есть присваивать этому указателю как-то так?
                                Ответить
                                • тебе что, так никто и не помог за пару часов?
                                  http://ideone.com/85biUm

                                  зы - отличная капча "5555" тут у меня
                                  Ответить
                                  • void * a, **b, (*(*signal2)(int sig, void (*func)(int)))(int) = &signal, **d = &a;

                                    Опа... Внезапно...
                                    Не ожидал.
                                    Ответить
                          • ты просто именованный аргумент испортил, разве нет?
                            signal - вот имя, из которого надо будет делать указатель на функцию
                            Ответить
                        • необходимо будет имя дополнительно обернуть в скобочки
                          ну а вставлять - после всей декларации, как обычно
                          Ответить
      • int (*f())()
        Указатель на функцию, возвращающий функцию, возвращающую int?
        Ответить
        • Прототип функции, возвращающей указатель на функцию, возвращающую int.

          P.S. Самому не нравится стиль описания указателей на функции в сишечке.
          Ответить
        • хрена лысого!
          это (форвард-)декларация функции с именем f, которая не принимает аргументов, и возвращает указатель на функцию, не принимающую аргументов и возвращающую int
          т.е. если ты соберешься использовать f далее по тексту - линкер должен будет её где-нибудь найти
          http://ideone.com/XYSU9j
          Ответить
          • Ну да, об этом я и написал чуть выше.

            Кстати еще мне очень не нравится сишное описание массивов и указателей. В той же жабе и паскале в одной строке всегда описывают переменные одного типа. В сишке же в одной строке описывать можно хуйпойми че.
            int[] a, b, c; // три жабьих массива из интов
            int a[2], b, c; // один сишкоблядский массив и 2 инта
            Ответить
            • каюсь, я заставлял идеоне компилить мой пример, пока писал ответ, вот и рассинхрон по времени
              туда же в кассу:
              typedef struct {} a, *pa, **ppa;
              Ответить
              • Ну это вообще классика жанра. Только обычно еще и имя структуре дается, чтобы компиляторы из каменного века понимали эту конструкцию:
                typedef struct a_ {} a, *pa, **ppa;
                Ответить
              • > туда же в кассу:
                а это как раз единственное полезное
                Ответить
                • typedef struct - это только в сях полезно - когда блядский компилятор везде заставляет тип подтверджать "да, ты не ослышался, это не сраный инт, это Структура ёпта!"
                  ну а виндоблядские копрофильные дефайны typedef ... FOO, * LPFOO, * LPTFOO; typedef const FOO CFOO, * LPCFOO, * LPTCFOO; пускай сами жрут
                  явно для дебилов сделано, которых звездочки в коде отвлекают, а вот капслок - да нормально, чо
                  Ответить
                  • >ну а виндоблядские копрофильные дефайны typedef ... FOO, * LPFOO, * LPTFOO; typedef const FOO CFOO, * LPCFOO, * LPTCFOO; пускай сами жрут явно для дебилов сделано, которых звездочки в коде отвлекают, а вот капслок - да нормально, чо

                    Бляяяя. Как меня это вымораживает. Хочется взять и уебать. Это ты правильно подметил.
                    Ответить
                    • > Хочется взять и уебать.
                      +++

                      LPCSTR, LPCWSTR, LPCTSTR...
                      Ответить
                      • >LPCSTR, LPCWSTR, LPCTSTR...
                        Это я склонен воспринимать как контрпример, т.е., когда такие typedefs оправданы
                        void f(
                          LPСSTR s, // Видно, что здесь передается строка
                          const char *pc, // А здесь - указатель (возможно, массив)
                          LPWSTR w // А тут - строка юникодных символов, которые могут быть определены по-разному
                        )


                        Разве что LP (Long Pointer) выглядит мусором.
                        Ответить
                        • винда головного мозга
                          как это юникодные символы wchar_t могут быть определены по-разному? с LPTSTR не спутал?
                          а в LPCSTR utf-8 программист не может хранить?

                          совсем забыл, недоработочка - обязательно надо использовать префикс/суффикс SZ, а то вдруг кто не поймет, что на конце строки ноль
                          Ответить
                          • Кстати, да. Определять LPWSTR иначе как wchar_t * вряд ли есть смысл; это сам wchar_t может быть нативным типом или typedef unsigned short в зависимости от компилятора и опций.

                            Но отличать от просто указателя все равно имхо полезно.
                            Ответить
        • Держи кстати декодер сишкоговнодеклараций: http://cdecl.ridiculousfish.com. В извращенных случаях может помочь ;) А в нормальных и в уме легко разобраться.
          Ответить
          • А обфускатора такого нет?
            Ответить
            • Есть. Называется "программист на С со стажем".
              Ответить
              • >программист на С со стажем
                Не думаю. Понимание этой хрени просто так не придет со стажем. Нужно просто быть немного двинутым, тогда захочешь это изучить специально. Многие программеры работают всю жизнь на си и не знают как написать
                void (*(&(*OMG[])())[]) (void (*)(void (*(*[])())()));
                Конечно такое нужно лишь из спортивного интереса или если встретил в своем проекте код гения, которого уволили.
                Ответить
                • > Понимание этой хрени просто так не придет со стажем.
                  Придет. Хотя быстро и точно писать и читать такие длинные херни не получится. Но умеренного размера - вполне.
                  Ответить
                  • >Придет.
                    Так если ты этим не пользуешься, как и каллеги по цеху, то почему понимание этого должно прийти?
                    Ответить
                    • Ну как не пользуешься. При написании сяшного кода довольно часто встречаются указатели на функции. Реже, но все же есть массивы этих указателей. Функции, принимающие функции тоже вполне нормальная практика (колбеки и т.п.).

                      Конечно все эти штуки простые и короткие, а все сложное завернуто в typedef... но ведь и в приведенном выше коде нет ничего нового. Все те же правила, что и в типичном коде. Ну разве что кроме бесполезных возвращаемых массивов.
                      Ответить
            • Ну вообще-то там и энкодер встроен. Просто напиши по-английски что за контСрукцию ты хочешь соорудить.
              Ответить
      • > этого крестоговна
        Если не совсем туплю - это наследственное заболевание, от сишки досталось.

        > int c();
        Так это же классический прототип функции. Аля
        int main();
        ...
        int main() {
            return 0;
        }
        Ответить
      • a - тупо инт;
        b - указатель на инт;
        c - прототип функции, возвращающей инт;
        d - прототип функции, возвращающей указатель на инт;
        e - указатель на функцию, возвращающую инт;
        f - прототип функции, возвращающей указатель на функцию, возвращающую инт (хаскель блять какой-то).

        Действительно очень сомнительно то, что можно в одной декларации смешать прототипы с прочими переменными.
        Ответить
    • http://www.gamedev.ru/flame/forum/?id=168742
      Ответить

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