忘记定义
他们会污染你的代码。
位域?
struct RecordFlag {
unsigned isnew:1, isdeleted:1, ismodified:1, isexisting:1;
};
永远不要使用它。您更关心速度而不是节省 4 个整数。使用位域实际上比访问任何其他类型都慢。
然而,结构中的位成员有实际的缺点。首先,内存中位的顺序因编译器而异。此外,许多流行的编译器生成读取和写入位成员的代码效率低下,并且由于大多数机器无法操作内存中的任意位集,因此可能存在与位域相关的严重线程安全问题(尤其是在多处理器系统上),但必须改为加载和存储整个单词。例如,尽管使用了互斥锁,但以下内容不是线程安全的
来源: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 或头文件中声明,它们的值将被内联。您将能够在这些值上使用 switch,但它会稍微增加耦合。
啊,是的:删除 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.
}
}
外部常量 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