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

    +42

    1. 1
    2. 2
    3. 3
    4. 4
    objbase.h:
    
    #define __STRUCT__ struct
    #define interface __STRUCT__

    спасибо Микрософт за счастливое детство соответствие стандарту при засирании глобального неймспейса своими больными фантазиями

    Запостил: defecate-plusplus, 03 Октября 2012

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

    • NOTE: Our documentation says '#define interface class' but we use 'struct' instead of 'class' to keep a lot of 'public:' lines out of the interfaces.
      Ответить
    • Я не знаю че эта за нёх, но в msvc есть __interface
      Сделали бы тогда
      #define interface __interface
      Ответить
      • Это типа слов __pascal, pascal,property, - но сам компилятор их не признает, просто IDE их определяет как ключевые.
        Ответить
        • >__pascal
          __tarasb
          Ответить
        • property и interface это ключевые слова C++/CLI (если врубить /clr, то конпелятор их будет хавать).
          Ответить
    • >соответствие стандарту при засирании глобального неймспейса
      Стандарт не запрещает засирать глобальный неймспейс, особенно при начинании идентификатора с __
      Другое дело, что они создали какой-то не правильный interface - это да, за это их нужно наказать.
      Ответить
      • стандарт рекомендует вендорам использовать имена, начинающиеся с одного подчеркивания и большой буквы, либо содержащие внутри себя два подчеркивания подряд

        я несколько расстроился, обнаружив, что моё struct interface { ... };, отлично работающее под г++, под студией отказалось компилироваться с непонятной ошибкой - interface ведь не ключевое слово с++
        Ответить
        • Оно кстати не отключается? В Qt, к примеру, в глобальном неймспейсе есть макрос foreach, но его при необходимости можно отключить, определив специальный макрос.
          Ответить
          • нет
            это тяжкое наследие СОМ
            и кстати если сделать #undef, то ломается всё, что с СОМ у них связано
            Ответить
        • > я несколько расстроился, обнаружив, что моё struct interface { ... };, отлично работающее под г++, под студией отказалось компилироваться
          > struct interface { ... };
          ЧТДНТ.
          Элсо interface в будущих стандартах может стать ключевым словом. Не стоит вносить возможную несовместимость.
          Ответить
          • не переживай
            текущая несовместимость с гениальными макросами студии уже вынудила меня переименовать структуру, описывающую состояние сетевого интерфейса
            а ключевым словом может стать всё, что угодно - думаю, отныне стоит называть типы, переменные и члены класса как
            struct O01lI0O { ... }; 
            O01lI0O IlII1Il;
            на всякий случай
            Ответить
            • Может есть какой-то флаг для отключения этой херни ? Как с min,max из шиндоус.х
              Ответить
              • нет, нету
                собственно, если не пользоваться одновременно каким-нибудь COM, то проблемы нет
                но в целом проблема актуальна, т.к.
                > grep -r "typedef interface" "C:\Program Files\Microsoft SDKs\Windows\v6.0A\include" | wc -l
                6301
                Ответить
            • в дебиане фигурирует слово iface (надеюсь, ябловоды не зарегистрируют iFace в качестве tm)
              Ответить
    • Имхо совершенно бесполезное ключевое слово для с++. Человек интерфейс от структуры и так отличит. А компилятору и так пофиг.

      Только засрали глобальный неймспейс, да ввели в заблуждение людей, которым приходится раскуривать что же такое interface, которого нет в стандарте.
      Ответить
    • Причем тут namespace? Это макрос, который вообще namespace'ам не подчиняется.
      Ответить
      • > макрос, который вообще namespace'ам не подчиняется
        Спасибо кэп. Вы удачно доебались до формулировки и открыли нам глаза.

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

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