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

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
typedef void Start1(void);
struct Kernel
{
    Start1 Start;
} kernel;
 
void Kernel::Start(void)
{
 
}

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

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

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

    • Имхо вредно неоперившимся говнокодерам давать такие возможности.
      Ответить
      • Надо их на брейнфайк сажать.

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

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

        Ещё через месяц - Java - они опять офигеют и начнут писать заебись какие крутые паттерны и даже свои придумают.
        Ответить
  • Это не крестоблядство, это крестопринципы.
    Ответить
  • на самом деле может кто-нибудь объяснит сакраментальную пользу вот этого крестоговна (пример в 2003 стандарте 8.3.5/9)?
    int a, *b, c(), *d(), (*e)(), (*f())();
    неужели подобной поеботой (c, d, f) кто-то пользуется?
    Ответить
    • Массив и функция возвращающая ссылку на этот массив забыл. Притом все в одном выражении.
      Ответить
      • я ведь отметил те "декларации", которые возмущают
        просто пример взят фактически из документа стандарта
        т.е. они этим как бы хвалятся
        Ответить
        • Блин, да нормальная это возможность. Раз сишка позволяла это (была настолько перегруженннной), то не отставать же от неё крестам.
          Ответить
          • ну просто у меня всё еще теплится надежда, что это может на самом деле киллер-фича
            а я чего-то не догоняю
            и что в сишке это нереально решало
            и что мне покажут пример, где это на самом деле пригождается
            ну типа че париться
            надо быть узнаваемым в толпе, отличный стиль, например - http://ideone.com/LJzWgO
            Ответить
              • не-не-не, дейвид блейн
                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;

                        Вот так по идее.
                        Ответить
                        • >Вот так по идее.
                          А где присвоение этому указателю написать?
                          Ответить
                            • void * a, **b, (*(*signal2=f)(int sig, void (*func)(int)))(int), **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...
                      Это я склонен воспринимать как контрпример, т.е., когда такие 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 - прототип функции, возвращающей указатель на функцию, возвращающую инт (хаскель блять какой-то).

      Действительно очень сомнительно то, что можно в одной декларации смешать прототипы с прочими переменными.
      Ответить

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

Помни, guest, за тобой могут следить!

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


    8