忘记定义
他们会污染您的代码。
位域?
struct RecordFlag {
unsigned isnew:1, isdeleted:1, ismodified:1, isexisting:1;
};
永远不要使用它。您更关心速度,而不是节省4个整数。使用位域实际上比访问任何其他类型慢。
但是,结构中的位成员具有实际缺陷。首先,内存中的位顺序因编译器而异。此外,许多流行的编译器会生成用于读写位成员的低效率代码,并且由于大多数机器无法操纵内存中的任意位集,因此存在与位字段相关的潜在严重线程安全问题(尤其是在多处理器系统上),但必须加载并存储整个单词。例如,尽管使用了互斥锁,但以下内容仍不是线程安全的
资料来源:http : //en.wikipedia.org/wiki/Bit_field:
如果你需要更多的理由不使用位域,或许雷蒙德陈会说服你在他的旧事新帖子:位域的成本效益分析为布尔值的集合在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关键字。照常使用C ++时不推荐使用static,并且如果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;
}
但是,您将无法在这些常量上使用switch。所以最后选择毒药... :-p