Answers:
在C语言中,以第一种方式声明枚举可让您像这样使用它:
TokenType my_type;
如果您使用第二种样式,则将被迫这样声明变量:
enum TokenType my_type;
正如其他人所提到的,这在C ++中没有任何区别。我的猜测是,编写此代码的人本质上是C程序员,或者您正在将C代码编译为C ++。无论哪种方式,它都不会影响代码的行为。
如果您这样做的话,这是C的C遗产:
enum TokenType
{
blah1 = 0x00000000,
blah2 = 0X01000000,
blah3 = 0X02000000
};
您必须使用它来执行以下操作:
enum TokenType foo;
但是,如果您这样做:
typedef enum e_TokenType
{
blah1 = 0x00000000,
blah2 = 0X01000000,
blah3 = 0X02000000
} TokenType;
您将可以声明:
TokenType foo;
但是在C ++中,您只能使用以前的定义,并且就像在C typedef中一样使用它。
您不需要这样做。在C(不是C ++)中,您需要使用枚举Enumname来引用枚举类型的数据元素。为了简化它,你被允许的typedef它一个名称的数据类型。
typedef enum MyEnum {
//...
} MyEnum;
允许将带有枚举参数的函数定义为
void f( MyEnum x )
而不是更长
void f( enum MyEnum x )
请注意,typename的名称不必等于枚举的名称。结构也是如此。
另一方面,在C ++中则不需要,因为枚举,类和结构可以通过名称直接作为类型进行访问。
// C++
enum MyEnum {
// ...
};
void f( MyEnum x ); // Correct C++, Error in C
在C语言中,这是一种很好的样式,因为您可以将类型更改为枚举以外的其他类型。
typedef enum e_TokenType
{
blah1 = 0x00000000,
blah2 = 0X01000000,
blah3 = 0X02000000
} TokenType;
foo(enum e_TokenType token); /* this can only be passed as an enum */
foo(TokenType token); /* TokenType can be defined to something else later
without changing this declaration */
在C ++中,您可以定义枚举,以便将其编译为C ++或C。
In C++ you can *typedef* the enum so that it will compile as C++ or C.
吗?您说:In C++ you can define the enum so that it will compile as C++ or C.
请注意我如何将您更改define
为typedef
。嗯......我想typedef
荷兰国际集团的定义。
有人说C没有命名空间,但是从技术上讲这是不正确的。它具有三个:
enum
,union
,和struct
)typedef enum { } XYZ;
声明一个匿名枚举,并将其导入名称为的全局命名空间XYZ
。
typedef enum ABC { } XYZ;
ABC
在标签名称空间中声明一个名为enum的枚举,然后将其导入到全局名称空间中XYZ
。
有些人不想打扰单独的命名空间,因此他们对所有内容进行类型定义。其他人从来没有键入def,因为他们想要命名空间。
这有点旧,但是无论如何,我希望您会喜欢我今年年初遇到的链接,因为我会喜欢它。
这里是。当我必须掌握一些讨厌的typedef时,我应该引用我心中永远存在的解释:
在变量声明中,引入的名称是相应类型的实例。[...]但是,当
typedef
关键字在声明之前时,引入的名称是相应类型的别名
就像许多人以前说过的那样,无需使用C ++中声明枚举的typedefs 。但这就是对typedef语法的解释!我希望它能对您有所帮助(由于已经使用了将近10年,所以可能不是OP,但是任何人都在努力理解此类事情)。