ENUM常数问题

时间:2011-09-21 09:02:09

标签: c++ enums constants

在此网站上发布了如何通过执行以下操作生成唯一枚举常量:

enum _EXAMPLE
{
    LEFT = 'left',
    RIGHT = 'right'
    //etc
};

忽略有效性问题,如何生成数字?更具体地说,使用什么技术?我希望尝试构建一个模拟短字符串的函数。

2 个答案:

答案 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)的名称当然足够了。