我已经很多年没有写c++了,现在我正试图重新开始写c++。然后我看到了这个,想过要放弃:

typedef enum TokenType
{
    blah1   = 0x00000000,
    blah2   = 0X01000000,
    blah3   = 0X02000000
} TokenType;

这是什么?为什么这里使用typedef关键字?为什么这个名称TokenType在这个声明中出现了两次?语义与此有何不同:

enum TokenType
{
    blah1 = 0x00000000,
    blah2=0x01000000,
    blah3=0x02000000
};

当前回答

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

TokenType my_type;

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

enum TokenType my_type;

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

其他回答

hold dover from拖延;

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

TokenType my_type;

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

enum TokenType my_type;

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

你不需要这么做。在C(不是c++)中,您需要使用枚举Enumname来引用枚举类型的数据元素。为了简化它,您可以将其类型定义为单个名称数据类型。

typedef enum MyEnum { 
  //...
} MyEnum;

允许使用枚举参数的函数定义为

void f( MyEnum x )

而不是更长

void f( enum MyEnum x )

注意,typename的名称不需要等于enum的名称。结构体也是如此。

另一方面,在c++中,这不是必需的,因为枚举、类和结构可以通过它们的名称直接作为类型访问。

// C++
enum MyEnum {
   // ...
};
void f( MyEnum x ); // Correct C++, Error in C

这有点老了,但无论如何,我希望你会喜欢我即将输入的链接,就像我今年早些时候看到它时一样。

在这儿。我应该引用一个解释,当我不得不抓住一些讨厌的类型定义时,我总是在我的脑海里:

在变量声明中,引入的名称是相应类型的实例。[…] 但是,当typedef关键字位于声明之前时,引入的名称是相应类型的别名

正如许多人之前所说,在c++中不需要使用类型defs来声明枚举。但这是对typedef语法的解释!我希望它能有所帮助(可能不是OP,因为已经快10年了,但任何人都在努力理解这些事情)。

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