Енумераторы или Дефайны?
От: Аноним  
Дата: 04.02.04 13:13
Оценка:
Енумераторы или Дефайны?

Здравствуйте,
У Строуструпа в книге стоит, что в С++ надо использовать enum а не define.
Я реалирую протокол (пишу и читаю из потока) хотелось бы конечно в качестве идентификаторов полеи не 1,2,3... а Енумы использовать. При отладке было бы проше на много. Можно вообше в/из стреама енумы писать и читат?

Zaranee blagodarju.

--
Valentin
heinitz-it.de
Re: Енумераторы или Дефайны?
От: LaptevVV Россия  
Дата: 04.02.04 13:15
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Енумераторы или Дефайны?


А>Здравствуйте,

А>У Строуструпа в книге стоит, что в С++ надо использовать enum а не define.
А>Я реалирую протокол (пишу и читаю из потока) хотелось бы конечно в качестве идентификаторов полеи не 1,2,3... а Енумы использовать. При отладке было бы проше на много. Можно вообше в/из стреама енумы писать и читат?

Ну, это ж такие же целые числа. Без проблем.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Енумераторы или Дефайны?
От: jazzer Россия Skype: enerjazzer
Дата: 04.02.04 13:47
Оценка: 6 (1)
Здравствуйте, Аноним, Вы писали:

А>Енумераторы или Дефайны?


А>Здравствуйте,

А>У Строуструпа в книге стоит, что в С++ надо использовать enum а не define.
А>Я реалирую протокол (пишу и читаю из потока) хотелось бы конечно в качестве идентификаторов полеи не 1,2,3... а Енумы использовать. При отладке было бы проше на много. Можно вообше в/из стреама енумы писать и читат?

Еще как! :)
Боее того, для перечислений (енумов) ты можешь переопределять операторы, и операторы вывода в поток — не исключение.
Так что ты можешь для любого перечисления организовать настолько красивый вывод, насколько захочешь
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: Енумераторы или Дефайны?
От: Bell Россия  
Дата: 04.02.04 14:29
Оценка: 1 (1)
Здравствуйте, LaptevVV, Вы писали:

LVV>Здравствуйте, Аноним, Вы писали:


А>>Енумераторы или Дефайны?


А>>Здравствуйте,

А>>У Строуструпа в книге стоит, что в С++ надо использовать enum а не define.
А>>Я реалирую протокол (пишу и читаю из потока) хотелось бы конечно в качестве идентификаторов полеи не 1,2,3... а Енумы использовать. При отладке было бы проше на много. Можно вообше в/из стреама енумы писать и читат?

LVV>Ну, это ж такие же целые числа. Без проблем.


Не совсем енумы даже не являются интегральгыми типами (3.9.1/7, сноска 43).
Хотя и существует стандартное преобразование enum -> int (unsigned int ...), позволяющее спокойно писать
enum E {e1 = 0};
...
E e;
e = e1;
std::cout << e << std::endl;


А вот обратного преобразования, увы, нет. И писать
std::cin >> e;

уже не получиться.
Любите книгу — источник знаний (с) М.Горький
Re[2]: Енумераторы или Дефайны?
От: Аноним  
Дата: 04.02.04 14:32
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Здравствуйте, Аноним, Вы писали:


А>>Енумераторы или Дефайны?


А>>Здравствуйте,

А>>У Строуструпа в книге стоит, что в С++ надо использовать enum а не define.
А>>Я реалирую протокол (пишу и читаю из потока) хотелось бы конечно в качестве идентификаторов полеи не 1,2,3... а Енумы использовать. При отладке было бы проше на много. Можно вообше в/из стреама енумы писать и читат?

J>Еще как!

J>Боее того, для перечислений (енумов) ты можешь переопределять операторы, и операторы вывода в поток — не исключение.
J>Так что ты можешь для любого перечисления организовать настолько красивый вывод, насколько захочешь

Oh! eto interesnaja ideja s peregruzkoi operatorov. nado polistat' u stroustrupa. Spasibo bol'shoe.

Velentin
heinitz-it.de
Re: Енумераторы или Дефайны?
От: MShura  
Дата: 04.02.04 14:34
Оценка: 1 (1) +1
Здравствуйте, Аноним, Вы писали:

А>Енумераторы или Дефайны?


А>Здравствуйте,

А>У Строуструпа в книге стоит, что в С++ надо использовать enum а не define.
А>Я реалирую протокол (пишу и читаю из потока) хотелось бы конечно в качестве идентификаторов полеи не 1,2,3... а Енумы использовать. При отладке было бы проше на много. Можно вообше в/из стреама енумы писать и читат?

А>Zaranee blagodarju.


А>--

А>Valentin
А>heinitz-it.de


Enum конечно удобней, однако надо помнить о том, что размер enum зависит от его значений и от компилятора.
Если нужна переносимость/совместимость, то про это не надо забывать.
Чтобы меньше зависить от этого, я частенько пишу последним значением enum что-то типа ENUM_PLACE_HOLDER = 0xFFFFFFFF.
Re[2]: Енумераторы или Дефайны?
От: korzhik Россия  
Дата: 04.02.04 14:41
Оценка:
Здравствуйте, MShura, Вы писали:

MS>Enum конечно удобней, однако надо помнить о том, что размер enum зависит от его значений и от компилятора.

MS>Если нужна переносимость/совместимость, то про это не надо забывать.
очень интересно.
Можно поподробней об этом.

MS>Чтобы меньше зависить от этого, я частенько пишу последним значением enum что-то типа ENUM_PLACE_HOLDER = 0xFFFFFFFF.

Что это даёт?
Просто никогда не сталкивался с этим.
Re[3]: Енумераторы или Дефайны?
От: LaptevVV Россия  
Дата: 04.02.04 14:56
Оценка:
Здравствуйте, Bell, Вы писали:

LVV>>Ну, это ж такие же целые числа. Без проблем.


B>Не совсем енумы даже не являются интегральгыми типами (3.9.1/7, сноска 43).

B>Хотя и существует стандартное преобразование enum -> int (unsigned int ...), позволяющее спокойно писать
B>
B>enum E {e1 = 0};
B>...
B>E e;
B>e = e1;
B>std::cout << e << std::endl;
B>


B>А вот обратного преобразования, увы, нет. И писать

B>
B>std::cin >> e;
B>

B>уже не получиться.
Надо просто перегрузить некоторые операции. Правда, иногда заморочки с компилятором случаются. Мой первый вопрос в форум как раз был про то, что VC6 не хотел enum в качестве параметра кушать.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[4]: Енумераторы или Дефайны?
От: Bell Россия  
Дата: 04.02.04 14:58
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>Надо просто перегрузить некоторые операции.

Вот видишь!
Любите книгу — источник знаний (с) М.Горький
Re[3]: Енумераторы или Дефайны?
От: jazzer Россия Skype: enerjazzer
Дата: 04.02.04 14:59
Оценка: 2 (1)
Здравствуйте, korzhik, Вы писали:

K>Здравствуйте, MShura, Вы писали:


MS>>Enum конечно удобней, однако надо помнить о том, что размер enum зависит от его значений и от компилятора.

MS>>Если нужна переносимость/совместимость, то про это не надо забывать.
K>очень интересно.
K>Можно поподробней об этом.

ну если ты завел enum {no=0, yes=1}, то для хранения значения такого енума достаточно char, а если твой enum содержит все коды ошибок винды, то меньше, чем интом, ты уже не обойдешься.

MS>>Чтобы меньше зависить от этого, я частенько пишу последним значением enum что-то типа ENUM_PLACE_HOLDER = 0xFFFFFFFF.

K>Что это даёт?
K>Просто никогда не сталкивался с этим.

Что для хранения значиния енума в переменной будет выбран целочисленный тип, достаточный для того, чтобы хранить все упомянутые значения, и если ты используешь большие, как в примере, то и тип хранения будт выбран соответствующий.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[3]: Енумераторы или Дефайны?
От: LaptevVV Россия  
Дата: 04.02.04 14:59
Оценка:
Здравствуйте, Аноним, Вы писали:

J>>Еще как!

J>>Боее того, для перечислений (енумов) ты можешь переопределять операторы, и операторы вывода в поток — не исключение.
J>>Так что ты можешь для любого перечисления организовать настолько красивый вывод, насколько захочешь

А>Oh! eto interesnaja ideja s peregruzkoi operatorov. nado polistat' u stroustrupa. Spasibo bol'shoe.


Достаточно подробно о перегрузке для енумов читайте в этой книжке
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[3]: Енумераторы или Дефайны?
От: MShura  
Дата: 04.02.04 17:08
Оценка: 2 (1)
Здравствуйте, korzhik, Вы писали:

K>Здравствуйте, MShura, Вы писали:


MS>>Enum конечно удобней, однако надо помнить о том, что размер enum зависит от его значений и от компилятора.

MS>>Если нужна переносимость/совместимость, то про это не надо забывать.
K>очень интересно.
K>Можно поподробней об этом.

MS>>Чтобы меньше зависить от этого, я частенько пишу последним значением enum что-то типа ENUM_PLACE_HOLDER = 0xFFFFFFFF.

K>Что это даёт?
K>Просто никогда не сталкивался с этим.


Как уже написал "jazzer" enum {no=0, yes=1} может занимать 1,2,4 байта (на 32 битных платформах).
Если переменная типа enum пишется в поток/(сохраняется на диск) одной программой, а читается другой, то тут как раз и могут возникнуть проблемы.

cl от MS, по-моему, не позволяет управлять этим поведением, и размер enum всегда равен размеру int.

Другие компиляторы, наоборот, по умолчанию используют минимальный размер, но имеют ключи для корректировки такого поведения.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.