質問
C++で64ビット列挙型を使用する方法はありますか?いくつかのコードをリファクタリングしているときに、列挙型としては適切な #define を大量に見つけましたが、32 ビットを超えるとコンパイラでエラーが発生します。
何らかの理由で、次のようにすればうまくいくかもしれないと思いました。
enum MY_ENUM : unsigned __int64
{
LARGE_VALUE = 0x1000000000000000,
};
解決
C++98では無理だと思います。enum の基礎となる表現はコンパイラ次第です。その場合は、以下を使用することをお勧めします。
const __int64 LARGE_VALUE = 0x1000000000000000L;
C++11 以降では、列挙型クラスを使用して列挙型の基本型を指定できます。
enum class MY_ENUM : unsigned __int64 {
LARGE_VALUE = 0x1000000000000000ULL
};
さらに、enum クラスには新しい名前スコープが導入されています。したがって、参照する代わりに LARGE_VALUE
, 、参考になります MY_ENUM::LARGE_VALUE
.
他のヒント
C++11 は、次の構文を使用してこれをサポートします。
enum class Enum2 : __int64 {Val1, Val2, val3};
いわゆる現在の草案 C++0x, 、それは n3092 で言う 7.2 列挙宣言, 、段落6:
列挙器の値がINTまたは符号なしのINTに適合できない場合を除き、基礎となるタイプがINTより大きくないことを除いて、どの積分タイプが基礎となるタイプとして使用されるかを定義する実装が定義されています。
同じ段落には次のようにも書かれています。
積分タイプがすべての列挙型値を表すことができない場合、列挙は不正に形成されます。
この部分の私の解釈 ただし、列挙子の値が int または unsigned int に収まらない場合は除きます。 つまり、特定の C++ 実装で 64 ビット整数型が提供されている限り、列挙子を 64 ビット整数値で初期化することは完全に有効かつ安全です。
例えば:
enum MyEnum
{
Undefined = 0xffffffffffffffffULL
};
を参照した回答 __int64
問題を見逃します。列挙型 は 真の 64 ビット整数型を持つすべての C++ コンパイラで有効です。任意の C++11 コンパイラ、または適切な拡張機能を備えた C++03 コンパイラ。C++03 の拡張機能 __int64
enum の基本型としての適合性を含め、コンパイラによって動作が異なります。
コンパイラがコンパイル フラグまたはその他の手段によって 64 ビット列挙型をサポートしていない場合、これに対する解決策はないと思います。
サンプルで次のようなものを作成できます。
namespace MyNamespace {
const uint64 LARGE_VALUE = 0x1000000000000000;
};
そしてそれを列挙型と同じように使用して、
MyNamespace::LARGE_VALUE
または
using MyNamespace;
....
val = LARGE_VALUE;
C++ で作業しているため、別の代替手段として次のような方法があります。
const __int64 LARVE_VALUE = ...
これは、H ファイルで指定できます。
コードの一部は C++ 標準ではありません。
列挙型 MY_ENUM :符号なし __int64
意味を成さない。
Torlackが示唆しているように、代わりにconst __int64を使用してください
Enum 型は通常、最初の enum 初期化子のデータ型によって決まります。値がその整数データ型の範囲を超える必要がある場合、C++ コンパイラは、より大きな整数データ型を使用して値が適合することを確認します。値がどの整数データ型にも属さないことがコンパイラによって検出された場合、コンパイラはエラーをスローします。参照: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1905.pdf
編集:ただし、これは純粋にマシンのアーキテクチャに依存します
C++ の列挙型には、任意の整数型を使用できます。たとえば、文字の列挙型を指定できます。IE:
enum MY_ENUM
{
CHAR_VALUE = 'c',
};
私は...するだろう 仮定する これには __int64 が含まれます。ただ試してみてください
enum MY_ENUM
{
LARGE_VALUE = 0x1000000000000000,
};
私のコメント投稿者、sixlettervariables 氏によると、C では基本型は常に int ですが、C++ では、基本型は含まれる最大の値を収めるのに十分な大きさのものです。したがって、上記の両方の列挙型が機能するはずです。
MSVC++ では、次のことができます。
enum MYLONGLONGENUM:__int64 { BIG_KEY=0x3034303232303330, ...};