4

次の (簡略化された) コードを考えてみましょう。

enum eTestMode
{
    TM_BASIC        = 1,    // 1 << 0
    TM_ADV_1        = 1 << 1,
    TM_ADV_2        = 1 << 2
};

...

int m_iTestMode;    // a "bit field"

bool isSet( eTestMode tsm )
{ 
    return ( (m_iTestMode & tsm) == tsm );
}

void setTestMode( eTestMode tsm )
{
    m_iTestMode |= tsm;
}

これは信頼性が高く、安全で、適切な方法ですか? または、列挙型の代わりに const int を使用する以外に、やりたいことを達成するためのより良い方法はありますか? 私は本当に列挙型を好みますが、コードの信頼性は読みやすさよりも重要です。

4

4 に答える 4

5

そのデザインに悪いところは見当たりません。

ただし、enum型は指定されていない値を保持できることに注意してください。誰が関数を使用するかによって、 の値がtsm有効な列挙値であることを最初に確認する必要がある場合があります。

は整数値であるためenums、次のようなことができます。

eTestMode tsm = static_cast<eTestMode>(17); // We consider here that 17 is not a valid value for your enumeration.

ただし、これを行うのは見苦しく、そうすると未定義の動作になると考えるかもしれません。

于 2010-06-30T12:07:15.630 に答える
0

Cの列挙型のサイズはどれくらいですか?も参照してください 。

一部のコンパイラ(VC ++など)では、この非標準の幅指定子を使用できます。

列挙型eTestMode:unsigned __int32
{{
    TM_BASIC = 1、// 1 << 0
    TM_ADV_1 = 1 << 1
    TM_ADV_2 = 1 << 2
};
于 2010-07-03T06:09:09.457 に答える
0

ビット パターン、マスク、およびフラグを表すために列挙型を使用することは、常に良い考えであるとは限りません。これは、列挙型は一般に符号付き整数型に昇格するのに対し、ビットベースの操作ではほとんどの場合、符号なし型が推奨されるためです。

于 2010-07-03T06:28:12.160 に答える
0

問題はない。その場合、すべての可能な値を保持することが保証されているため、eTestMode の変数を使用することもできます (およびその型のビット操作を定義します)。

于 2010-06-30T12:05:21.740 に答える