Если у меня есть перечисление С++:
enum Foo
{
Bar,
Baz,
Bork,
};
Как сообщить компилятору использовать uint16_t
для фактического хранения значения перечисления?
EDIT: поддерживает ли GCC эту функцию при реализации С++ 11?
Если у меня есть перечисление С++:
enum Foo
{
Bar,
Baz,
Bork,
};
Как сообщить компилятору использовать uint16_t
для фактического хранения значения перечисления?
EDIT: поддерживает ли GCC эту функцию при реализации С++ 11?
Вы не можете сделать это в С++ 98/03. С++ 11 позволяет вам это делать и без enum class
, как все говорят вам все:
enum EnumType : uint16_t
{
Bar,
Baz,
Bork,
};
Опять же, вам не нужно использовать enum class
. Не то, чтобы это была плохая идея, но вам это не нужно.
Поддерживает ли GCC эту функцию в своей реализации С++ 11?
Какая версия GCC? Похоже, что GCC 4.4 добавила эту функциональность, но вы, вероятно, должны смотреть на более свежие версии, только ради нее стабильности.
В С++ 11 вы можете сделать это:
enum class Foo : uint16_t
{
Bar,
Baz,
Bork,
};
Позже вы также можете узнать базовый тип перечисления как:
#include <type_traits>
std::underlying_type<Foo>::type v = 10; //v is uint16_t
С c++11
теперь у вас enum class
, который позволяет явно указать базовый тип:
enum class Foo: uint16_t
{
Bar,
Baz,
Bork,
};
С pre-С++ 2011 вы можете заставить минимальное хранилище использовать подходящий диапазон значений:
enum foo {
v0 = 0,
vmax = 32767
};
Я думаю, что компилятор может выбрать либо знак, либо целое число без знака в качестве базового типа. В приведенном выше диапазоне было установлено, что в представлении используется как минимум short
как его основное целое число. Сделать его еще одним большим может заставить его использовать long
вместо этого. Конечно, это только заставляет минимальный диапазон, и компилятор может выбрать более широкий диапазон. Кроме того, с приведенным выше определением вам не разрешается отклоняться от диапазона [0, 32767]
: если вам действительно нужен 16-битный диапазон (по крайней мере), вам нужно использовать соответствующие значения).