定義を忘れる
彼らはあなたのコードを汚染します。
ビットフィールド?
struct RecordFlag {
unsigned isnew:1, isdeleted:1, ismodified:1, isexisting:1;
};
これを使用しないでください。4 intを節約するよりも速度に関心があります。ビットフィールドの使用は、他のタイプへのアクセスよりも実際には低速です。
ただし、構造体のビットメンバーには実用上の欠点があります。まず、メモリ内のビットの順序はコンパイラごとに異なります。さらに、多くの一般的なコンパイラは、ビットメンバーの読み取りと書き込みのための非効率的なコードを生成します、ほとんどのマシンはメモリ内の任意のビットセットを操作できないため、ビットフィールド(特にマルチプロセッサシステム)に関連する潜在的な重大なスレッドセーフティの問題があります。代わりに、単語全体を読み込んで保存する必要があります。たとえば、以下はミューテックスを使用しているにもかかわらず、スレッドセーフではありません
ソース: http //en.wikipedia.org/wiki/Bit_field:
そしてあなたがするより多くの理由が必要な場合 ビットフィールドを使用ない、レイモンドチェンがThe Old New Thing Post:ブール値のコレクションのビットフィールドの費用便益分析で説得する可能性があります。にhttp://blogs.msdn.com/oldnewthing/アーカイブ/2008/11/26/9143050.aspx
const int?
namespace RecordType {
static const uint8 xNew = 1;
static const uint8 xDeleted = 2;
static const uint8 xModified = 4;
static const uint8 xExisting = 8;
}
それらを名前空間に置くのはクールです。それらがCPPまたはヘッダーファイルで宣言されている場合、それらの値はインライン化されます。これらの値でスイッチを使用できますが、カップリングが少し増加します。
ああ、はい:staticキーワードを削除します。staticは、使用時にC ++で非推奨になり、uint8が組み込みタイプの場合、同じモジュールの複数のソースに含まれるヘッダーでこれを宣言するためにこれを必要としません。最後に、コードは次のようになります。
namespace RecordType {
const uint8 xNew = 1;
const uint8 xDeleted = 2;
const uint8 xModified = 4;
const uint8 xExisting = 8;
}
このアプローチの問題は、コードが定数の値を認識しているため、結合がわずかに増加することです。
列挙型
const intと同じですが、タイピングがやや強力です。
typedef enum { xNew = 1, xDeleted, xModified = 4, xExisting = 8 } RecordType;
彼らはまだグローバル名前空間を汚染しています。ところで... typedefを削除します。C ++で作業しています。列挙型と構造体のこれらのtypedefは、何よりもコードを汚染します。
結果はちょっとです:
enum RecordType { xNew = 1, xDeleted, xModified = 4, xExisting = 8 } ;
void doSomething(RecordType p_eMyEnum)
{
if(p_eMyEnum == xNew)
{
// etc.
}
}
ご覧のように、列挙型はグローバル名前空間を汚染しています。この列挙型を名前空間に入れると、次のようになります。
namespace RecordType {
enum Value { xNew = 1, xDeleted, xModified = 4, xExisting = 8 } ;
}
void doSomething(RecordType::Value p_eMyEnum)
{
if(p_eMyEnum == RecordType::xNew)
{
// etc.
}
}
extern const int?
カップリングを減らしたい場合(つまり、定数の値を非表示にできるため、完全な再コンパイルを必要とせずに、必要に応じてそれらを変更できます)、intをヘッダーでexternとして、CPPファイルで定数として宣言できます。 、次の例のように:
// Header.hpp
namespace RecordType {
extern const uint8 xNew ;
extern const uint8 xDeleted ;
extern const uint8 xModified ;
extern const uint8 xExisting ;
}
そして:
// Source.hpp
namespace RecordType {
const uint8 xNew = 1;
const uint8 xDeleted = 2;
const uint8 xModified = 4;
const uint8 xExisting = 8;
}
ただし、これらの定数でスイッチを使用することはできません。だから最後に、あなたの毒を選びます... :-p