在此网站上发布了如何通过执行以下操作生成唯一枚举常量:
enum _EXAMPLE
{
LEFT = 'left',
RIGHT = 'right'
//etc
};
忽略有效性问题,如何生成数字?更具体地说,使用什么技术?我希望尝试构建一个模拟短字符串的函数。
答案 0 :(得分:4)
'left'
是一个多字符文字(C ++ 03的2.13.2 / 1),它的类型为int
。
它的实现定义了它实际具有的整数值。特别是,不能保证'left'
和'right'
不相等,所以你要在枚举中使用它们。
但是,例如,GCC在此处记录其行为:http://gcc.gnu.org/onlinedocs/gcc-4.6.1/cpp/Implementation_002ddefined-behavior.html#Implementation_002ddefined-behavior
'right'
有五个字符,显然每个5个字符的字符串都不可能有不同的32位值。
答案 1 :(得分:1)
多字符常量是您通常想要避免的。假设您的系统是32位架构的小端。在这种情况下,'left'
会转换为:
('l')+('e'<<8)+('f'<<16)+('t'<<24)
注意,为了便于阅读,我在每个字符后面省略了int
的强制转换。
因此多字符常量实际上是一个整数。
我曾经使用'BM'
检查我读取的.bmp图像的前两个字节,以检查文件类型是否正确,但很快我就认为不值得我保存的额外几个字符。如果你使用大端系统,或者你的int
有不同的大小等等,你会遇到问题。更不用说烦人的编译器警告了。
如果您有enum
,通常会有两种情况:
案例1 ,您不关心枚举的值。在那种情况下,你只需留下它们。第一个将变为零,编译器将逐步填充其余部分。
案例2 ,您需要这些值以达到明确目的。在这种情况下,您需要逐个为您分配它们。例如,如果您想要enum
您的程序的子系统,并且您需要启用,禁用它们,您可以拥有1个变量,即|
个enum
个值,如下所示:
enum subsystem
{
SUBSYSTEM_1 = 0x0001,
SUBSYSTEM_2 = 0x0002,
SUBSYSTEM_3 = 0x0004,
SUBSYSTEM_4 = 0x0008,
SUBSYSTEM_5 = 0x0010,
/* etc */
};
(有趣的是,您是否知道C ++在,
的最后一个元素之后接受了额外的enum
?)
在任何情况下,您都不希望出现与'left'
对应的奇怪值。如果您认为可以清楚地阅读代码,那么您可以确定常量(LEFT
)的名称当然足够了。