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

    −97

    1. 1
    2. 2
    3. 3
    /*
    удалено по просьбе правообладателя
    */

    macro driven development.

    Тот же цискоиндуский код.

    Запостил: gorthauer87, 22 Сентября 2015

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

    • а надо как?
      Ответить
      • я свичом делаю, не обламывает
        Ответить
        • В голову пришла вот такая наркомань:
          // some.enum
          ENUM_BEGIN(Some)
              ENUM_VALUE(Foo, 1)
              ENUM_VALUE(Bar, 2)
          ENUM_END(Some)
          
          // some.h
          #define ENUM_GEN_TO_STRING "some.enum"
          #include "enum_gen.h"
          
          // some.c
          #define ENUM_GEN_HELPERS "some.enum"
          #include "enum_gen.h"
          Ответить
          • // enum_gen.h
            #ifdef ENUM_GEN_HEADER
            #define ENUM_BEGIN(Name) enum Name {
            #define ENUM_VALUE(Name, Value) Name = Value,
            #define ENUM_END(Name) \
                }; \
                const char * Name##_toString(enum Name val);
            
            #include ENUM_GEN_HEADER
            #undef ENUM_GEN_HEADER
            #endif
            
            #ifdef ENUM_GEN_HELPERS
            #define ENUM_BEGIN(Name) \
                const char * Name##_toString(enum Name val) { \
                    switch (val) {
            #define ENUM_VALUE(Name, Value) \
                    case Value: return #Name;
            #define ENUM_END(Name) \
                    default: return "х.з.";
                    }
                }
            #include ENUM_GEN_HELPERS
            #undef ENUM_GEN_HELPERS
            #endif
            Ответить
          • Блин, накосячил с именами и не успел поправить. И андефы забыл. Ну главное суть :)
            Ответить
            • Браво, в производство!*
              Надо попробовать, кстати. Правда, доксиджен с коллегами охренеют от такого поворота :)
              case Value: return #Name;
              Есть нюанс: один дремучий компилятор генерирует из этого нерабочий код и приходится делать подобное говно:
              case Value: { static const char * retval = "ValueText"; return retval; }
              из какого-то фитиля
              Ответить
          • > такая наркомань
            Я подобную наркомань у нас уже кое-где видел :)
            Более того, в clang-е такого добра тоже полно:
            https://github.com/llvm-mirror/clang/blob/master/include/clang/Basic/TokenKinds.def
            Можно ещё и остальные def-файлы посмотреть, принцип такой же.
            Ответить
    • защита от забытых бряков, что вам не нравится?
      Ответить
      • Тем, что это костыль. Тут выше по ветке куда более красивые решения показывали.
        Ответить
    • Ох уж эти макросоёбылюбы.
      Ответить

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