1. Си / Говнокод #13322

    +139

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    #define InlineIsEqualGUID(rguid1, rguid2)  \
            (((unsigned long *) rguid1)[0] == ((unsigned long *) rguid2)[0] &&   \
            ((unsigned long *) rguid1)[1] == ((unsigned long *) rguid2)[1] &&    \
            ((unsigned long *) rguid1)[2] == ((unsigned long *) rguid2)[2] &&    \
            ((unsigned long *) rguid1)[3] == ((unsigned long *) rguid2)[3])

    Windows SDK, guiddef.h

    ret = InlineIsEqualGUID(&g_guid, guid_array + i); /* ??? */

    Запостил: serg_ik, 07 Июля 2013

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

    • Суровый C'шный inline :)
      Ответить
      • показать все, что скрытоЭто не сишка, а говно, причем тотальное. Мало того, что питухи не осилил stdint.h, указатели, мозги и саму сишку. Я всё удивляюсь - откуда берут таких животных, которые это пишут.
        Ответить
    • не ожидал что в некрософте, в официальных хидерах, будут переизобретать memcmp() (который IIRC некрософтовый родной компилер уже как хез давно, в случае мелких констных размеров, умеет инлайнить).
      Ответить
      • показать все, что скрытоЭто говно хоть раз было сишным конпелятором? Чёт я не помню того. А хедеры разве написанны в си-стайле? Нет, в питушачьем недопаскаль-недостайле. Чему ты удивляешься?
        Ответить
        • показать все, что скрытоПитушок, который минусанул. Маздайский конпелятор - самый тормазной, ущербный и малофичный, созданный бездарями кусок говно, который нормально не поддерживает не один стандарт. Это говно даже Си-конпелятором не называется.

          Либо я не прав? И это говно хотябы один стандарт поддерживает?
          Ответить
          • > И это говно хотябы один стандарт поддерживает?
            C89 вроде как в нем все-таки есть.
            Ответить
    • > ret = InlineIsEqualGUID(&g_guid, guid_array + i); /* ??? */
      В чем вопросики заключаются, если не секрет?

      Из минусов кода:
      - Железобетонная привязка к 32 битному unsigned long. Из-за таких, простите, питушков, мс и оставило long 32 битным даже на x86-64.
      - Макрос назван как функция (не капсом), но в то же время вычисляет свои аргументы от 1 до 4 раз. Может привести к веселым последствиям, если кто-то "оптимизирует" код, и подставит вызов функции в один из параметров макро.
      Ответить
      • >В чем вопросики заключаются, если не секрет?
        Раскрой маркос. Там rguid не обернуты скобками
        Ответить
        • > Раскрой маркос. Там rguid не обернуты скобками
          А ну да, туплю, вы правы. Оно еще и забагует на guid_array + i, смещаясь по 4 байта вместо 16...

          В любом случае аффтар сего макроса не знал основ макроёбства :)
          Ответить
          • > А ну да, туплю, вы правы. Оно еще и забагует на guid_array + i, смещаясь по 4 байта вместо 16...
            Собственно после встречи с этой "фичей" IRL захотелось поделиться этой макрой.
            Ответить
            • Жопа еще и в том, что они назвали это макро без капса, в стиле функции. Я бы так и думал, что это функция, пока бы не навел курсор на ее имя или не прыгнул бы на определение...
              Ответить
            • P.S. Где-то тут проскакивало еще одно забавное определение от майкрософта:
              #define interface struct
              ...
              // ради вот этого дерьма в описаниях COM интерфейсов
              interface SomeShit {
              };
              ...
              // ломаем весь код в котором есть слово interface
              class interface {
              };
              class Some {
                  Other interface() { ... }
              }
              Ответить

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