質問

問題点:

を使用している大きなC/C++のコードベースで動作するgcc&visual studioのコンパイラがenumベースタイプは、デフォルトの32ビット整数タイプ)です。

このコードで多くのインライン組み込み組み立て扱うenumとして整数型の列挙型のデータとして使用32ビットフラグが多いのです。

きめこのコードrealviewアームRVCT2.2コンパイラ開始し、多くの問題からrealviewコンパイラを決定enumベースタイプから自動的に価値の列挙型定です。 http://www.keil.com/support/man/docs/armccref/armccref_Babjddhe.htm

例えば、

考え、以下のenum、

enum Scale {
    TimesOne, //0
    TimesTwo, //1
    TimesFour, //2
    TimesEight, //3
};

このenumとして使用32ビットフラグ。がコンパイラの最適化しunsigned char型のenum.

利用--enum_is_intコンパイラオプションにあてはまるわけではないの解決の場合には、変換しすべての列挙型の32ビットまで休みの相互作用と外部コードに指--enum_is_int.

この警告で見つけたRVCTコンパイラ-図書館ガイド

のenum_is_intオプションではない おすすめ一般的に使用しない 必要なISO対応ソースです。コードのようにコンパイルされてこのオプションではない に準拠しABIのアーム 建築基準)[BSABI], や誤使用が 失敗を行います。このオプションではない のC++ライブラリ.

質問

どのように変換すべての列挙型の基底型による手コード変更用の32ビットの影響のない値の順序?

enum Scale {
    TimesOne=0x00000000,
    TimesTwo, // 0x00000001
    TimesFour, // 0x00000002
    TimesEight, //0x00000003
};

また、上記変化します。がコンパイラの最適化本でも悪い。:(

ある構文です。純ように

enumの規模:int

このISO C++の標準およびアームのコンパイラに欠けるのですか?

ありません#pragma制御このenumにアームRVCT2.2コンパイラです。が隠されpragma利用できますか?

役に立ちましたか?

解決

私は窓ヘッダの多くは、以下を使用することを知っています:

enum SOME_ENUM {
    ONE = 1,
    TWO = 2,
    //...
    FORCE_DWORD = 0x7FFFFFFF
};

他のヒント

はC ++ 11:

enum class Scale : uint32_t {
   TimesOne, //0
   TimesTwo, //1
   TimesFour, //2
   TimesEight, //3
};

のVisual Studio 2012とgcc 4.4.6 -std = C ++ 0xのオプションの両方をサポートこの(以前のバージョンも同様ことがあります。)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top