我已经很多年没有写c++了,现在我正试图重新开始写c++。然后我看到了这个,想过要放弃:
typedef enum TokenType
{
blah1 = 0x00000000,
blah2 = 0X01000000,
blah3 = 0X02000000
} TokenType;
这是什么?为什么这里使用typedef关键字?为什么这个名称TokenType在这个声明中出现了两次?语义与此有何不同:
enum TokenType
{
blah1 = 0x00000000,
blah2=0x01000000,
blah3=0x02000000
};
有些人说C语言没有名称空间,但这在技术上是不正确的。它有三个:
标签(enum、联合和struct)
标签
(其他)
typedef enum {} XYZ;声明一个匿名枚举,并将其导入名称为XYZ的全局命名空间。
typedef enum ABC {} XYZ;在标记名称空间中声明一个名为ABC的枚举,然后将其作为XYZ导入全局名称空间。
有些人不想为单独的名称空间而烦恼,所以他们对所有东西都进行类型定义。另一些人从不使用类型定义,因为他们需要命名空间。
这是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类型定义中一样使用它。
在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。