2011-09-21 94 views
0

有人在网站上公布,你怎么会产生这样做唯一的枚举常量以下问题:枚举常量

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

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

回答

4

'left'多字符字面(2.13.2/1的C++ 03),它具有输入int

这是实现定义什么整数值,它实际上有。特别是,有没有保证,'left''right'是不相等的,所以你在使用枚举他们是在以一个失败者的东西。

举一个例子,不过,GCC在这里记录了它的行为:http://gcc.gnu.org/onlinedocs/gcc-4.6.1/cpp/Implementation_002ddefined-behavior.html#Implementation_002ddefined-behavior

'right'有5个字符,并明确这是不可能的,每5个字符的字符串有不同的32位值。

+0

虽然它一定是一致的吗?为了使字符文字始终得到0-255范围的正确值? – SSight3

+1

“一致”是什么意思?每个C++实现必须定义和记录多字符文字的值(这就是“实现定义”的含义),所以每次运行程序时,“left”会具有相同的值。不过,不同的编译器可能会给出不同的值。 ''c''不是一个多字符文字,它具有'char'类型,并且等于执行字符集中小写字母“c”的数字值。 –

+0

那么,我假定一个字面单个字符将使用与字面多字符相同的功能? – SSight3

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)肯定足够。

+0

它更像是一个聪明的窍门,在后台作为写入值(EG'w + b'),因此用户可以通过赋值运算符将它传递给File类 - 它可以将它作为int,long等来提取,文件名为char数组。我试图避免警告,因为它们看起来难看。 – SSight3

+1

在这种情况下,您可以像第二种情况那样定义值,并且他们可以通过'WRITE + BINARY'这个更具可读性且语法相同的语法(注意,由于'enum'ed值的位不重叠,'+'像'|'一样工作 – Shahbaz