Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > enum


Автор: Hawaii 26.8.2007, 22:13
Какой размер у значений перечисляемого типа enum ? Или каждое значение имеет свой размер.

Есть такая строчка. enum employee_type {tmanager, tscientist, tlaborer};

Является ли каждое в отдельности значение tmanager, tscientist, tlaborer типом char*  или каким-нибудь другим?

Как эти значения записываются в файл в этом коде, неужели посимвольно?

Код

      etype = arrap[j]->get_type();
                              //write type to file
      ouf.write( (char*)&etype, sizeof(etype) );        <------  ???
      switch(etype)           //find its size                       
         {                                                          
         case tmanager:   size=sizeof(manager); break;               
         case tscientist: size=sizeof(scientist); break;        
         case tlaborer:   size=sizeof(laborer); break;
         }                    //write employee object to file 
      ouf.write( (char*)(arrap[j]), size );



 smile

Автор: bsa 26.8.2007, 22:15
Это зависит от настроек компилятора. По сути, enum эквивалентен unsigned.

Автор: zkv 26.8.2007, 22:21
Код

write( /*А тут требуется приведение типа?*/(char*)&etype, sizeof(etype) );

этого достаточно smile

Автор: Lazin 26.8.2007, 23:10
по умолчанию enum это unsigned int, а значения в фигурных скобках - просто константы, если явно не указывать то начинаются с нуля tmanager = 0, tscientist = 1, tlaborer = 2

Автор: Hawaii 26.8.2007, 23:31
ouf.write( (char*)&etype, sizeof(unsigned int) );     Спасибо всем за разъяснение.   С аргументом   unsigned int тоже работает  smile     

Автор: zkv 27.8.2007, 00:36
Цитата(Hawaii @  26.8.2007,  23:31 Найти цитируемый пост)
ouf.write( (char*)&etype, sizeof(unsigned int) );

все таки лучше было:
Код

write( (char*)&etype, sizeof(etype) );

так как:
Цитата(bsa @  26.8.2007,  22:15 Найти цитируемый пост)
Это зависит от настроек компилятора.

а второй вариант не будет от них зависеть

Автор: bsa 27.8.2007, 10:10
Цитата(Hawaii @ 26.8.2007,  23:31)
ouf.write( (char*)&etype, sizeof(unsigned int) );     Спасибо всем за разъяснение.   С аргументом   unsigned int тоже работает  smile

На самом деле, я немного упростил свой ответ. Все намного сложнее. Например, на архитектуре x86_64 под Linux перечисления могут иметь размер sizeof(unsigned long) == 2*sizeof(unsigned).
Поэтому правильная запись - так, как указал zkv.
С другой стороны, если ты собираешься работать с платформонезависимым форматом файла и не хочешь переписывать процедуры под разные платформы и настройки компилятора, то надо пользоваться жестко заданными размерами (без использования sizeof).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)