упаковка enum

Тема в разделе "LANGS.C", создана пользователем redcat, 14 май 2009.

  1. redcat

    redcat New Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    62
    Можно ли как-то упаковать перечислимый тип? Известно, что он имеет размер sizeof(int).

    Есть такой код (фрагменты из Linux NTFS Project):
    Код (Text):
    1. // ...
    2. typedef uint16_t u16;
    3. // ...
    4. #if defined(__CHECKER__) && !defined(NTFS_DO_NOT_CHECK_ENDIANS)
    5.     #undef __bitwise
    6.     #undef __force
    7.     #define __bitwise __attribute__((bitwise))
    8.     #define __force __attribute__((force))
    9. #else
    10.     #undef __bitwise
    11.     #undef __force
    12.     #define __bitwise
    13.     #define __force
    14. #endif
    15. // ...
    16. typedef u16 __bitwise le16;
    17. //...
    18. #define __constant_cpu_to_le16(x) ((__force le16)(x))
    19. //...
    20. #define const_cpu_to_le16(x)    (le16)__constant_cpu_to_le16((u16)(x))
    21. //...
    22. typedef enum {
    23.     MFT_RECORD_IN_USE       = const_cpu_to_le16(0x0001),
    24.     MFT_RECORD_IS_DIRECTORY     = const_cpu_to_le16(0x0002),
    25.     MFT_RECORD_IS_4         = const_cpu_to_le16(0x0004),
    26.     MFT_RECORD_IS_VIEW_INDEX    = const_cpu_to_le16(0x0008),
    27.     MFT_REC_SPACE_FILLER        = const_cpu_to_le16(0xffff),
    28.                     /* Just to make flags 16-bit. */
    29. } __attribute__((__packed__)) MFT_RECORD_FLAGS;
    Хотелось бы подобное получить в VC++. Что-то типа следующего:
    Код (Text):
    1. #pragma pack(push, 2)
    2. typedef enum _FLAG
    3. {
    4.     f1 = 0x0001,
    5.     f2 = 0x0002,
    6.     f3 = 0x0004,
    7.     f4 = 0xffff
    8. } FLAG;
    9. #pragma pack(pop)
     
  2. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Мы в удивлении — зачем это может быть нужно? Enum'ы — это некий сорт констант же:
    Код (Text):
    1. const unsigned short f1 = 0x0001;
    2. const unsigned short f2 = 0x0002;
    3. const unsigned short f3 = 0x0004;
     
  3. redcat

    redcat New Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    62
    Да, но это не просто набор констант, а определенный пользователем ТИП содержащий набор именованных констант.
     
  4. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615