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

    +162

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    /*
        Макрос генерирует внутренности функции-заглушки OpenGL.
    */
    #define BWT_DECLARE_OPENGL_PROC_IMPL(PROC, PROC_TYPE, ...)                                  \
        static PROC_TYPE _##PROC = 0;                                                           \
                                                                                                \
        if (_##PROC)                                                                            \
            return _##PROC(__VA_ARGS__);                                                        \
        else                                                                                    \
        {                                                                                       \
            _##PROC = TryToGetProcAddress<PROC_TYPE>(#PROC);    return _##PROC(__VA_ARGS__);    \
        }
    
    /*
        Функция получает адрес функции, или возбуждает исключение, если адрес получить не удалось.
    */
    template<typename proc_type>
    proc_type TryToGetProcAddress(const char *proc_name) throw(error_type<VIDEO>)
    {
        proc_type address = reinterpret_cast<proc_type>(::SDL_GL_GetProcAddress(proc_name));
    
        if (!address)
            BWT_THROW_VIDEO_ERROR(UNDEFINED_ERROR, "OpenGL version does not supported");
    
        return address;
    }
    
    GLAPI void APIENTRY glCullFace (GLenum mode)
    {
        BWT_DECLARE_OPENGL_PROC_IMPL(glCullFace, PFNGLCULLFACEPROC, mode);
    }
    
    ...

    Запостил: ZltCity, 15 Октября 2010

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

    • Твою мать @_@
      Ответить
    • О-о-о... "возбуждает исключение"...
      Ответить
      • Действующие лица: функция 1 (ф1), функция 2(ф2).
        ф1: уважаемая ф2, можно узнать ваш адрес ?
        ф2: нет, я же чистая виртуальная функция ...
        ф1: м-м-м ... жаль ... моё исключение уже так возбужденО ...
        p.s. все персонажи вымышлены, любое сходство с реальными событиями и лицами случайно.
        Ответить
        • ф3: ф1, не отчаивайся. Воспользуйся одним из 2 своих стандартных exception_handler'ов. В моём классе все так делают :)
          Ответить
        • ага, вымышлены... щас, вот так и поверил...
          Ответить
    • Много переусложненных вещей без явной на то причины (а именно - на макрос возложено больше, чем надо было возлагать), но том не мнее сделано все более-менее аккуратно. Если кому-то нравится делать это именно так - пусть делают.

      Т.е. код "не нужный" во многом, но не говнокод ни разу.
      Ответить

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