Здравствуйте,
У Строуструпа в книге стоит, что в С++ надо использовать enum а не define.
Я реалирую протокол (пишу и читаю из потока) хотелось бы конечно в качестве идентификаторов полеи не 1,2,3... а Енумы использовать. При отладке было бы проше на много. Можно вообше в/из стреама енумы писать и читат?
Здравствуйте, Аноним, Вы писали:
А>Енумераторы или Дефайны?
А>Здравствуйте, А>У Строуструпа в книге стоит, что в С++ надо использовать enum а не define. А>Я реалирую протокол (пишу и читаю из потока) хотелось бы конечно в качестве идентификаторов полеи не 1,2,3... а Енумы использовать. При отладке было бы проше на много. Можно вообше в/из стреама енумы писать и читат?
Ну, это ж такие же целые числа. Без проблем.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, Аноним, Вы писали:
А>Енумераторы или Дефайны?
А>Здравствуйте, А>У Строуструпа в книге стоит, что в С++ надо использовать enum а не define. А>Я реалирую протокол (пишу и читаю из потока) хотелось бы конечно в качестве идентификаторов полеи не 1,2,3... а Енумы использовать. При отладке было бы проше на много. Можно вообше в/из стреама енумы писать и читат?
Еще как! :)
Боее того, для перечислений (енумов) ты можешь переопределять операторы, и операторы вывода в поток — не исключение.
Так что ты можешь для любого перечисления организовать настолько красивый вывод, насколько захочешь
Здравствуйте, 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.
Здравствуйте, Аноним, Вы писали:
А>Енумераторы или Дефайны?
А>Здравствуйте, А>У Строуструпа в книге стоит, что в С++ надо использовать enum а не define. А>Я реалирую протокол (пишу и читаю из потока) хотелось бы конечно в качестве идентификаторов полеи не 1,2,3... а Енумы использовать. При отладке было бы проше на много. Можно вообше в/из стреама енумы писать и читат?
А>Zaranee blagodarju.
А>-- А>Valentin А>heinitz-it.de
Enum конечно удобней, однако надо помнить о том, что размер enum зависит от его значений и от компилятора.
Если нужна переносимость/совместимость, то про это не надо забывать.
Чтобы меньше зависить от этого, я частенько пишу последним значением enum что-то типа ENUM_PLACE_HOLDER = 0xFFFFFFFF.
Здравствуйте, MShura, Вы писали:
MS>Enum конечно удобней, однако надо помнить о том, что размер enum зависит от его значений и от компилятора. MS>Если нужна переносимость/совместимость, то про это не надо забывать.
очень интересно.
Можно поподробней об этом.
MS>Чтобы меньше зависить от этого, я частенько пишу последним значением enum что-то типа ENUM_PLACE_HOLDER = 0xFFFFFFFF.
Что это даёт?
Просто никогда не сталкивался с этим.
Здравствуйте, 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 в качестве параметра кушать.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, korzhik, Вы писали:
K>Здравствуйте, MShura, Вы писали:
MS>>Enum конечно удобней, однако надо помнить о том, что размер enum зависит от его значений и от компилятора. MS>>Если нужна переносимость/совместимость, то про это не надо забывать. K>очень интересно. K>Можно поподробней об этом.
ну если ты завел enum {no=0, yes=1}, то для хранения значения такого енума достаточно char, а если твой enum содержит все коды ошибок винды, то меньше, чем интом, ты уже не обойдешься.
MS>>Чтобы меньше зависить от этого, я частенько пишу последним значением enum что-то типа ENUM_PLACE_HOLDER = 0xFFFFFFFF. K>Что это даёт? K>Просто никогда не сталкивался с этим.
Что для хранения значиния енума в переменной будет выбран целочисленный тип, достаточный для того, чтобы хранить все упомянутые значения, и если ты используешь большие, как в примере, то и тип хранения будт выбран соответствующий.
Здравствуйте, Аноним, Вы писали:
J>>Еще как! J>>Боее того, для перечислений (енумов) ты можешь переопределять операторы, и операторы вывода в поток — не исключение. J>>Так что ты можешь для любого перечисления организовать настолько красивый вывод, насколько захочешь
А>Oh! eto interesnaja ideja s peregruzkoi operatorov. nado polistat' u stroustrupa. Spasibo bol'shoe.
Достаточно подробно о перегрузке для енумов читайте в этой книжке
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, 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.
Другие компиляторы, наоборот, по умолчанию используют минимальный размер, но имеют ключи для корректировки такого поведения.