不要过度使用宏定义
它们会让你的代码变得混乱不堪。
位字段?
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/archive/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或头文件中声明,它们的值将被内联。您将能够使用这些值进行switch语句,但这会略微增加耦合。
啊,是的:删除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)
{
}
}
正如你所看到的,枚举类型正在污染全局命名空间。
如果将此枚举类型放入命名空间中,你将会得到以下代码:
As you see, your enum is polluting the global namespace.
If you put this enum in an namespace, you'll have something like:
namespace RecordType {
enum Value { xNew = 1, xDeleted, xModified = 4, xExisting = 8 } ;
}
void doSomething(RecordType::Value p_eMyEnum)
{
if(p_eMyEnum == RecordType::xNew)
{
}
}
extern const int ?
如果您想减少耦合度(即能够隐藏常量的值,从而可以根据需要修改这些值而无需进行完整的重新编译),您可以在头文件中将int声明为extern,在CPP文件中声明为constant,例如以下示例:
namespace RecordType {
extern const uint8 xNew ;
extern const uint8 xDeleted ;
extern const uint8 xModified ;
extern const uint8 xExisting ;
}
并且:
namespace RecordType {
const uint8 xNew = 1;
const uint8 xDeleted = 2;
const uint8 xModified = 4;
const uint8 xExisting = 8;
}
然而,您将无法在这些常量上使用 switch。所以最终,选择你的毒药... :-p
enum RecordType : uint8_t
结合了enum
的类型安全性和uint8_t
的小尺寸,尽管您仍需要提供位运算符。 - Justin Time - Reinstate Monica