をオーバーベースの列挙型を用いpragmaまたはコードの変更
質問
問題点:
を使用している大きな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のオプションの両方をサポートこの(以前のバージョンも同様ことがあります。)
と