問題:
私は、列挙型ベースタイプがデフォルトで32ビット(整数型)であるgccおよびビジュアルスタジオコンパイラで動作する大きなC /C++コードベースを使用しています。
このコードには、列挙型を整数型として扱い、多くの場合、列挙型データが32ビットフラグとして使用されるインライン+埋め込みアセンブリも多数含まれています。
このコードをrealviewARMRVCT 2.2コンパイラでコンパイルすると、realviewコンパイラがenumが設定されている値に基づいてenumベースタイプを自動的に決定するため、多くの問題が発生し始めました。http://www.keil.com/support/man/docs/armccref/armccref_Babjddhe.htm
例えば、
以下の列挙型を検討してください。
enum Scale {
TimesOne, //0
TimesTwo, //1
TimesFour, //2
TimesEight, //3
};
この列挙型は32ビットフラグとして使用されます。ただし、コンパイラは、この列挙型のunsignedchar型に最適化します。
--enum_is_intコンパイラオプションを使用すると、すべての列挙型が32ビットに変換され、-enum_is_intなしでコンパイルされた外部コードとの相互作用が中断されるため、この場合は適切なソリューションではありません。
これは、RVCTコンパイラとライブラリガイドで見つけた警告です。
--enum_is_intオプションは、一般的な使用には推奨されておらず、ISO互換のソースには必要ありません。このオプションでコンパイルされたコードは、ARMアーキテクチャ(基本標準)[BSABI]のABIに準拠していないため、誤って使用すると、実行時に障害が発生する可能性があります。このオプションは、C++ライブラリではサポートされていません。
質問
値の順序に影響を与えることなく、すべての列挙型の基本型を(手動でコーディングされた変更によって)32ビットを使用するように変換するにはどうすればよいですか?
enum Scale {
TimesOne=0x00000000,
TimesTwo, // 0x00000001
TimesFour, // 0x00000002
TimesEight, //0x00000003
};
上記の変更を試みました。しかし、コンパイラはこれを私たちの不運のためにも最適化します。:(
.NETには次のような構文があります
列挙型スケール:int
これはISOC++標準であり、ARMコンパイラにはありませんか?
ARMRVCT2.2コンパイラでこの列挙型を制御する#pragmaはありません。利用可能な隠しプラグマはありますか?