这个枚举是什么意思?

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

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

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

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

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

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

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

 SomeOption myOptions = FirstOption | ThirdOption; 

你可以检查这样设置的选项:

 if (myOptions & ThirdOption) { ... } 

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

 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) 

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

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

示例可能如下所示:

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

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

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

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

 myflags | OptionKeyB