有人在网站上公布,你怎么会产生这样做唯一的枚举常量以下问题:枚举常量
enum _EXAMPLE
{
LEFT = 'left',
RIGHT = 'right'
//etc
};
忽略有效性的问题,是如何产生的数字?更具体地说,使用什么技术?因为我想尝试构建一个模拟短字符串的函数。
有人在网站上公布,你怎么会产生这样做唯一的枚举常量以下问题:枚举常量
enum _EXAMPLE
{
LEFT = 'left',
RIGHT = 'right'
//etc
};
忽略有效性的问题,是如何产生的数字?更具体地说,使用什么技术?因为我想尝试构建一个模拟短字符串的函数。
'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位值。
多字符常量是你通常会希望避免的事情。假设你的系统是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-255范围的正确值? – SSight3
“一致”是什么意思?每个C++实现必须定义和记录多字符文字的值(这就是“实现定义”的含义),所以每次运行程序时,“left”会具有相同的值。不过,不同的编译器可能会给出不同的值。 ''c''不是一个多字符文字,它具有'char'类型,并且等于执行字符集中小写字母“c”的数字值。 –
那么,我假定一个字面单个字符将使用与字面多字符相同的功能? – SSight3