这个枚举是什么意思?

时间:2011-08-26 20:02:00

标签: c

我今天看到了这行代码并且不知道它的作用。

typedef enum {
  SomeOptionKeys = 1 << 0 // ?
} SomeOption;

某些用法或示例会有所帮助。谢谢!

4 个答案:

答案 0 :(得分:9)

它看起来像是定义了一个应该包含一组标志的枚举类型。您希望看到更多定义,例如:

typedef enum {
  FirstOption = 1 << 0,
  SecondOption = 1 << 1,
  ThirdOption = 1 << 2
} SomeOption;

由于它们被定义为2的幂,因此每个值对应于整数变量中的单个位。因此,您可以使用按位运算符组合它们并测试它们是否已设置。这是C代码中的常见模式。

您可以编写这样的代码组合它们:

SomeOption myOptions = FirstOption | ThirdOption;

您可以检查哪些选项设置如下:

if (myOptions & ThirdOption)
{
  ...
}

答案 1 :(得分:4)

SomeOptionKeys的值是1,这在使用flags时是一个有用的表示:

typedef enum {
  flag1 = 1 << 0, // binary 00000000000000000000000000000001
  flag2 = 1 << 1, // binary 00000000000000000000000000000010
  flag3 = 1 << 2, // binary 00000000000000000000000000000100
  flag4 = 1 << 3, // binary 00000000000000000000000000001000
  flag5 = 1 << 4, // binary 00000000000000000000000000010000
  // ...
} SomeOption;

Whit方式每个标志只有一个位设置,它们可以用位图表示。

编辑:

虽然,我不得不说,我可能会遗漏一些东西,但对我来说,使用枚举似乎是不情愿的。由于您在此配置中失去了枚举的任何优势,因此您也可以使用#define

#define flag1 (1<<0)
#define flag2 (1<<1)
#define flag3 (1<<2)
#define flag4 (1<<3)
#define flag5 (1<<4)

答案 2 :(得分:2)

它只是将枚举设置为值1.它可能旨在表示值为2的幂。下一个可能被指定为1 << 1等。

答案 3 :(得分:1)

&LT;&LT;是左移算子。通常,当您希望枚举掩盖单个位时使用此选项。在这种情况下,转换实际上并没有做任何事情,因为它是0,但你可能会看到它出现在更复杂的情况下。

示例可能如下所示:

typedef enum {
   OptionKeyA = 1<<0,
   OptionKeyB = 1<<1,
   OptionKeyC = 1<<2,
} OptionKeys;

然后,如果你有一些带有选项键的函数,你可以使用枚举作为位掩码来检查是否设置了一个选项。

int ASet( OptionKeys x){
   return (x & OptionKeyA);
}

或者,如果您有一个标志位图并想要设置一个选项:

myflags | OptionKeyB