C++ で 64 ビット列挙型を使用する方法はありますか? 一部のコードをリファクタリングしているときに、列挙型としてはより適切な一連の #defines に遭遇しましたが、32 ビットを超えるとコンパイラでエラーが発生します。
何らかの理由で、次のことがうまくいくと思いました:
enum MY_ENUM : unsigned __int64
{
LARGE_VALUE = 0x1000000000000000,
};
C ++ 11は、次の構文を使用してこれをサポートします。
enum class Enum2 : __int64 {Val1, Val2, val3};
C++98 では無理だと思います。列挙型の基本的な表現は、コンパイラ次第です。その場合、次を使用することをお勧めします。
const __int64 LARGE_VALUE = 0x1000000000000000L;
C++11 では、enum クラスを使用して、enum の基本型を指定できます。
enum class MY_ENUM : unsigned __int64 {
LARGE_VALUE = 0x1000000000000000ULL
};
さらに、enum クラスは新しい名前スコープを導入します。したがって、 を参照する代わりに、 を参照しLARGE_VALUE
ますMY_ENUM::LARGE_VALUE
。
いわゆるC++0xの現在のドラフト、それはn3092であり、 7.2列挙宣言のパラグラフ6で次のように述べています。
列挙子の値がintまたはunsignedintに収まらない場合を除いて、基になる型がintより大きくてはならないことを除いて、どの整数型が基になる型として使用されるかは実装によって定義されます。
同じ段落にも次のように書かれています。
すべての列挙子の値を表すことができる整数型がない場合、列挙は不正な形式になります。
列挙子の値がintまたはunsignedintに収まらない場合を除いて、この部分の私の解釈は 、特定のC ++で64ビット整数型が提供されている限り、64ビット整数値で列挙子を初期化することは完全に有効で安全であるということです。実装。
例えば:
enum MyEnum
{
Undefined = 0xffffffffffffffffULL
};
問題を見逃すことを参照する回答__int64
。列挙型は、真の 64 ビット整数型を持つすべての C++ コンパイラ (つまり、C++11 コンパイラ、または適切な拡張機能を持つ C++03 コンパイラ) で有効です。C++03 like への拡張機能は__int64
、列挙型の基本型としての適合性を含め、コンパイラ間で異なる動作をします。
コンパイラがコンパイルフラグまたはその他の手段によって64ビット列挙型をサポートしていない場合、これに対する解決策はないと思います。
サンプルで次のようなものを作成できます。
namespace MyNamespace {
const uint64 LARGE_VALUE = 0x1000000000000000;
};
を使用して列挙型のように使用します
MyNamespace::LARGE_VALUE
また
using MyNamespace;
....
val = LARGE_VALUE;
あなたはC++で作業しているので、別の選択肢は
const __int64 LARVE_VALUE = ...
これはHファイルで指定できます。
コードのスニペットは C++ 標準ではありません:
enum MY_ENUM : unsigned __int64
意味を成さない。
Torlack が示唆するように、代わりに const __int64 を使用してください
Enum type is normally determined by the data type of the first enum initializer. If the value should exceed the range for that integral datatype then c++ compiler will make sure it fits in by using a larger integral data type.If compiler finds that it does not belong to any of the integral data type then compiler will throw error.
Ref: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1905.pdf
Edit: However this is purely depended on machine architecture
MSVC++ では、これを行うことができます。
enum MYLONGLONGENUM:__int64 { BIG_KEY=0x3034303232303330, ... };
C++ の列挙型は、任意の整数型にすることができます。たとえば、文字の列挙型を持つことができます。いいえ:
enum MY_ENUM
{
CHAR_VALUE = 'c',
};
これには__int64が含まれていると思います。試してみてください
enum MY_ENUM
{
LARGE_VALUE = 0x1000000000000000,
};
私のコメンターである sixlettervariables によると、C では基本型は常に int になりますが、C++ では基本型は含まれる最大の値に適合するのに十分な大きさです。したがって、上記の両方の列挙型が機能するはずです。