64-битное перечисление в C ++?

c++ enums 64-bit

24210 просмотра

10 ответа

41285 Репутация автора

Есть ли способ получить 64-битное перечисление в C ++? При рефакторинге некоторого кода я наткнулся на кучу #defines, которые были бы лучше в виде enum, но, если они больше 32 бит, это приводит к ошибке компилятора.

По какой-то причине я подумал, что может сработать следующее:

enum MY_ENUM : unsigned __int64  
{  
    LARGE_VALUE = 0x1000000000000000,  
};
Автор: Rob Источник Размещён: 16.09.2008 08:28

Ответы (10)


0 плюса

49621 Репутация автора

Перечисление в C ++ может быть любого целочисленного типа. Вы можете, например, иметь набор символов. IE:

enum MY_ENUM
{
   CHAR_VALUE = 'c',
};

Я бы предположил, что это включает в себя __int64. Попробуй просто

enum MY_ENUM
{
   LARGE_VALUE = 0x1000000000000000,
};

Согласно моему комментатору, Sixlettervariables, в C базовый тип всегда будет int, в то время как в C ++ базовый тип достаточно большой, чтобы соответствовать наибольшему включенному значению. Таким образом, оба перечисленных выше должны работать.

Автор: Doug T. Размещён: 16.09.2008 08:30

17 плюса

83482 Репутация автора

Решение

Я не думаю, что это возможно с C ++ 98. Основное представление перечислений зависит от компилятора. В этом случае вам лучше использовать:

const __int64 LARGE_VALUE = 0x1000000000000000L;

Начиная с C ++ 11, можно использовать классы enum для указания базового типа перечисления:

enum class MY_ENUM : unsigned __int64 {
    LARGE_VALUE = 0x1000000000000000ULL
};

Кроме того, enum классы вводят новую область имен. Таким образом, вместо того, чтобы ссылаться на LARGE_VALUE, вы бы ссылались MY_ENUM::LARGE_VALUE.

Автор: Ferruccio Размещён: 16.09.2008 08:32

1 плюс

3969 Репутация автора

Поскольку вы работаете в C ++, другой альтернативой может быть

const __int64 LARVE_VALUE = ...

Это может быть указано в файле H.

Автор: Torlack Размещён: 16.09.2008 08:34

2 плюса

7634 Репутация автора

Если компилятор не поддерживает 64-битные перечисления с помощью флагов компиляции или любым другим способом, я думаю, что нет никакого решения для этого.

Вы можете создать что-то вроде в вашем примере что-то вроде:

namespace MyNamespace {
const uint64 LARGE_VALUE = 0x1000000000000000;
};

и используя его так же, как использование перечисления

MyNamespace::LARGE_VALUE 

или же

using MyNamespace;
....
val = LARGE_VALUE;
Автор: INS Размещён: 16.09.2008 08:37

1 плюс

2259 Репутация автора

Ваш фрагмент кода не соответствует стандарту C ++:

enum MY_ENUM: без знака __int64

не имеет смысла.

вместо этого используйте const __int64, как предлагает Torlack

Автор: ugasoft Размещён: 16.09.2008 08:38

17 плюса

28509 Репутация автора

C ++ 11 поддерживает это, используя этот синтаксис:

enum class Enum2 : __int64 {Val1, Val2, val3};
Автор: Leon Timmermans Размещён: 16.09.2008 08:56

4 плюса

139834 Репутация автора

Ответы, указывающие на __int64пропущенную проблему. Перечисление является действительным во всех компиляторах C ++ , которые имеют истинный 64 битые интегральный тип, то есть любой C ++ 11 компилятора или C ++ 03 компиляторов с соответствующими расширениями. Расширения до C ++ 03 __int64работают по-разному в разных компиляторах, включая его пригодность в качестве базового типа для перечислений.

Автор: MSalters Размещён: 17.09.2008 09:42

0 плюса

0 Репутация автора

В MSVC ++ вы можете сделать это:

enum MYLONGLONGENUM: __ int64 {BIG_KEY = 0x3034303232303330, ...};

Автор: Anonhelper Размещён: 24.09.2009 09:05

5 плюса

29525 Репутация автора

Текущий проект так называемого C ++ 0x , это n3092, говорит в 7.2 Объявления перечисления , параграф 6:

Определяется реализацией, какой интегральный тип используется в качестве базового типа, за исключением того, что базовый тип не должен быть больше, чем int, если только значение перечислителя не может поместиться в int или unsigned int.

В том же абзаце также говорится:

Если ни один целочисленный тип не может представлять все значения перечислителя, перечисление неверно сформировано.

Моя интерпретация этой части, если только значение перечислителя не может поместиться в int или unsigned int, заключается в том, что вполне допустимо и безопасно инициализировать перечислитель 64-разрядным целочисленным значением, если в конкретном C ++ предусмотрен 64-разрядный целочисленный тип. реализация.

Например:

enum MyEnum
{
    Undefined = 0xffffffffffffffffULL
};
Автор: mloskot Размещён: 13.04.2010 03:27

1 плюс

1132 Репутация автора

Тип перечисления обычно определяется типом данных первого инициализатора перечисления. Если значение должно превышать диапазон для этого целочисленного типа данных, то компилятор c ++ удостоверится, что оно соответствует, используя больший тип интегральных данных. Если компилятор обнаружит, что он не принадлежит ни к одному из целочисленных типов данных, то компилятор выдаст ошибку. Ссылка: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1905.pdf
Редактировать: Однако это зависит исключительно от архитектуры машины

Автор: human.js Размещён: 07.12.2012 02:05
Вопросы из категории :
32x32