首页 > 解决方案 > C中的这些枚举有什么区别?

问题描述

C新手,所以我在这里感到困惑。

我有三个不同的枚举

enum Space{STAR = 6, PLANET, SUN =3, EARTH =5, PLUTO};

typedef enum {STAR = 6, PLANET, SUN =3, EARTH =5, PLUTO}System;

typedef enum Space{STAR = 6, PLANET, SUN =3, EARTH =5, PLUTO}System;

这三者之间究竟有什么区别?

我知道它们是 int 类型的有序变量集,因此 PLANET = 7、PLUTO = 6 等。

但是我尝试打印这些值,但它们似乎都一样。

printf("%d", PLANET);

标签: cstructenumstypedef

解决方案


这可能看起来很奇怪或令人困惑,但是:结构、联合和枚举最终可能在 C 中具有两个(或多个)不同的名称。

第一个并且在某种意义上更基本的名称通常称为“标签”。这是您的第一个示例中的名称:

enum Space {STAR = 6, PLANET, SUN = 3, EARTH = 5, PLUTO};

我们创建了一个新的枚举(实际上是一个新类型),描述了 5 个枚举常量,我们给它命名为“ Space”。

标签名称不是全局的——单词“ Space”不足以唯一标识我们创建的这种新类型。如果我们想声明一个可以保存这种新枚举类型值的变量,我们必须enum在这样做时重复关键字:

enum Space spacevar;

如果我们试着说

Space spacevar;

编译器会抱怨,因为Space它不是类型名称,它只是一个标签名称。

(这有点像美国地理中的“华盛顿”这个名字。它是指太平洋西北部的华盛顿州,还是华盛顿特区?我们总是需要更多的信息,一个额外的词或缩写,以确定。)

然后我们来到 typedefs。typedef 确实创建了一个新的类型名称(对于现有类型)。typedef 可以“包含”大量信息。如果我们说

typedef int myint;

thenmyint只是 的同义词int。但是如果我们说

typedef int *intptr;

thenintptr表示“指向”的指针int,它“包含” *; 我们可以稍后说

intptr p1, p2;

我们得到两个指针。同样,如果我们说

typedef enum Space System;

thenSystem是一个新的类型名称,意思是“ enum Space”,它“包含”关键字enum。稍后我们可以声明另一个枚举类型的变量

System spacevar2;

这与

enum Space spacevar2;

除了当我们使用System声明spacevar2变量时,我们不必重复那个enum关键字。

所以现在我们可以回到你的第二个和第三个例子。你的第三个例子,

typedef enum Space {STAR = 6, PLANET, SUN = 3, EARTH = 5, PLUTO} System;

在同一行同时声明标签名称Space和类型名称。System就好像你说过

enum Space {STAR = 6, PLANET, SUN = 3, EARTH = 5, PLUTO} System;
typedef enum Space System;

在两条线上。

然后你的第二个例子

typedef enum {STAR = 6, PLANET, SUN = 3, EARTH = 5, PLUTO} System;

创建相同的新类型,除了它只给它一个类型名称,而不是一个标签名称。这为您提供了一个枚举类型,您可以在其中仅使用类型名称形式声明新变量:

System spacevar3;

在这种情况下,你不能说

enum ??? spacevar3

因为您还没有声明可以在???现场使用的标签名称。

但最后,无论您使用哪种形式以及如何声明枚举变量,您都可以以相同的方式使用它们。你可以说

spaceval = STAR;

spaceval2 = PLANET;

spaceval3 = SUN;

根据您用来定义变量的名称(标签名称或类型名称),您必须使用不同的方式来使用变量。


推荐阅读