定義を忘れる
それらはあなたのコードを汚染します。
ビットフィールド?
struct RecordFlag {
unsigned isnew:1, isdeleted:1, ismodified:1, isexisting:1;
};
それを使用しないでください。あなたは 4 int を節約するよりもスピードに関心があります。ビット フィールドを使用すると、実際には他の型へのアクセスよりも遅くなります。
ただし、構造体のビット メンバーには実際的な欠点があります。まず、メモリ内のビットの順序はコンパイラごとに異なります。さらに、多くの一般的なコンパイラは、ビット メンバーの読み取りと書き込みに対して非効率なコードを生成します。また、ほとんどのマシンがメモリ内のビットの任意のセットを操作できないため、ビット フィールドに関連する深刻なスレッド セーフの問題が発生する可能性があります (特にマルチプロセッサ システムでは)。代わりに、単語全体をロードして保存する必要があります。たとえば、ミューテックスを使用しているにもかかわらず、以下はスレッドセーフではありません。
ソース: http://en.wikipedia.org/wiki/Bit_field :
また、ビットフィールドを使用しない理由がさらに必要な場合は、Raymond ChenがThe Old New Thingの投稿であなたを納得させるでしょう: http://blogs.msdn.com/oldnewthing/アーカイブ/2008/11/26/9143050.aspx
定数整数?
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++ で作業しています。これらの列挙型と構造体の型定義は、何よりもコードを汚染しています。
結果はちょっと:
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.
}
}
外部定数 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;
}
ただし、これらの定数に対して switch を使用することはできません。最後に、あなたの毒を選んでください... :-p