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

    +132

    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
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    Было:
    
    typedef struct {
        int range;      /*enabled flag*/
    
        union {
            struct {
                unsigned str_length;
            };
            struct {
                long i_min;
                long i_max;
            };
            struct {
                double d_min;
                double d_max;
            };
            /* ... */
        };
    } wlp_range_t;
    
    #define WLP_NO_RANGE()              { .range = FALSE }
    #define WLP_STRING_LENGTH(length)   { .range = TRUE, .str_length = length}
    #define WLP_INT_RANGE(min, max)     { .range = TRUE, .i_min = min, .i_max = max }
    #define WLP_FLOAT_RANGE(min, max)   { .range = TRUE, .d_min = min, .d_max = max }
    
    Стало:
    
    typedef struct {
        int range;      /*enabled flag*/
    
        struct {
            struct {
                unsigned str_length;
            };
            struct {
                long i_min;
                long i_max;
            };
            struct {
                double d_min;
                double d_max;
            };
            /* ... */
    
        };
    } wlp_range_t;
    
    #define WLP_NO_RANGE()              { B_FALSE, { {0} } }
    #define WLP_STRING_LENGTH(length)   { B_TRUE, { {length} } }
    #define WLP_INT_RANGE(min, max)     { B_TRUE, { {0}, {min, max} } }
    #define WLP_FLOAT_RANGE(min, max)   { B_TRUE, { {0}, {0, 0}, {min, max} } }
    #define WLP_SIZE_RANGE(min, max)    { B_TRUE, { {0}, {0, 0}, {0.0, 0.0}, {min, max} } }
    
    /* ... */

    Такая вот бяка получилась при портировании проекта с GCC на Visual C. А все потому, что:
    1. ISO C++03 8.5.1[dcl.init.aggr]/15:
    | When a union is initialized with a brace-enclosed initializer,
    | the braces shall only contain an initializer for the first member of the union.
    2. Visual C не поддерживает designated initializers

    Запостил: myaut, 24 Декабря 2012

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

    • MS VC 6.0?
      Ответить
      • VS2010 Express
        С некрофилией - это к Тарасу
        Ответить
        • Насколько знаю, ни одна студия не умеет С99, поэтому при кодинге на Си некрофилия относится ко всем студиям ;)

          P.S. А как отличали, какие члены юниона юзать в каждой ситуации? Никакой инфы об этом в структурке не видно...
          Ответить
          • Там еще есть над-структурка, которая собственно тип и содержит
            Ответить
            • > Там еще есть над-структурка
              ...смерть его на конце иглы, игла в яйце, яйцо в утке, утка в зайце...
              Ответить
    • >{ .range = TRUE, .i_min = min, .i_max = max }
      Гэцэцизм (sic!)
      Ответить
      • Ой, это Си. С99
        Ответить
        • C99 поддерживает опускание {} для инициализации полей для безымяных юнионов?

          последный раз я на эту тему читал, это был gcc-ism.
          Ответить
    • Ну и скобочки вокруг аргументов хотелось бы поставить. Хотя... не, наверное, не надо.
      Ответить
    • Говно эта ваша студия.
      Ответить
    • Хорошо, если он используется только как tagged и если он не записан куда-то в бинарном виде, тогда багов не будет, но всё же...шож вам память-то не жаль?
      Ответить
    • что было говно, что стало
      я понимаю было бы
      union { 
          struct { uint8_t b0, b1, b2, b3; }; 
          struct { uint16_t s0, s1; };
          uint32_t l;
      };
      но мешать огурцы и молоко - вот и получилось что получилось
      Ответить

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