我已经很多年没有写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代码风格指南中,typedef版本被认为是“清晰”和“简单”的首选。 我不同意,因为typedef混淆了所声明对象的真实性质。事实上,我不使用typedef,因为当声明一个C变量时,我想清楚对象实际上是什么。 这种选择可以帮助我更快地记住一段旧代码的实际功能,并在将来维护代码时帮助其他人。

hold dover from拖延;

在C语言中,以第一种方式声明枚举可以这样使用:

TokenType my_type;

如果你使用第二种风格,你将被迫像这样声明你的变量:

enum TokenType my_type;

正如其他人所提到的,这在c++中没有什么不同。我的猜测是,要么写这篇文章的人本质上是一个C程序员,要么你把C代码编译成c++。无论哪种方式,它都不会影响代码的行为。

有些人说C语言没有名称空间,但这在技术上是不正确的。它有三个:

标签(enum、联合和struct) 标签 (其他)

typedef enum {} XYZ;声明一个匿名枚举,并将其导入名称为XYZ的全局命名空间。

typedef enum ABC {} XYZ;在标记名称空间中声明一个名为ABC的枚举,然后将其作为XYZ导入全局名称空间。

有些人不想为单独的名称空间而烦恼,所以他们对所有东西都进行类型定义。另一些人从不使用类型定义,因为他们需要命名空间。

在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。