1

問題:

私は、列挙型ベースタイプがデフォルトで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はありません。利用可能な隠しプラグマはありますか?

4

2 に答える 2

4

多くのWindowsヘッダーが以下を使用していることを私は知っています:

enum SOME_ENUM {
    ONE = 1,
    TWO = 2,
    //...
    FORCE_DWORD = 0x7FFFFFFF
};
于 2010-03-26T04:55:38.593 に答える
0

C ++ 11の場合:

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

VisualStudio2012と-std=c ++0xオプションを指定したgcc4.4.6はどちらもこれをサポートしています(以前のバージョンでも同様です)。

于 2013-02-25T21:40:09.770 に答える