在C语言中定义枚举



我有点惊讶下面的代码不能编译。你能解释一下吗?(头文件)

enum CarType_e {
    CAR_BMW = 0,
    CAR_KIA,
    CAR_HONDA,
    CAR_FORD,
    CAR_MERCEDES
};
int build_car(CarType_e type);

,然后得到以下错误:

In file included from car.c:19:0:
car.h:35:16: error: unknown type name ‘CarType_e’

你有两个选择,使用

typedef enum {
  CAR_BMW = 0,
  CAR_KIA,
  CAR_HONDA,
  CAR_FORD,
  CAR_MERCEDES
} CarType_e;

也可以使用-

int build_car(enum CarType_e type);

在C语言中,每个自定义类型(枚举、联合和结构体)都有自己的命名范围。

你需要写int build_car(enum CarType_e type);
这也意味着_e后缀没有意义。

也可以使用typedef

无论你在哪里使用enum CarType_e,你都需要说:

int build_car(enum CarType_e type);

typedef为enum。

typedef enum {
    CAR_BMW = 0,
    CAR_KIA,
    CAR_HONDA,
    CAR_FORD,
    CAR_MERCEDES
} CarType_e;

您需要通过指定枚举的标记以及enum关键字来告诉编译器您正在使用枚举。否则,编译器如何解决像

这样的歧义?
struct foo { int x; char y; };
enum   foo { CAR, BIKE, ROCKET };
union  foo { int x; char y; };
int build_car (foo x);   /* A struct foo or an enum foo or a union foo? */

请注意,结构体、枚举和联合都有一个单独的标记名称空间,所以我可以像上面所示的那样自由地为它们重用相同的标记名称。

要求标签名如

int build_car (enum foo x);
int build_bike (struct foo x);
int build_rocket (union foo x);

对于编译器来说,使其无二义性。

不要在意结构体/联合的类型定义;它们是无用的,只有无知的人才会考虑它们。是的,这个观点很强烈。它们所做的只是让您不必在几个地方写struct——这是您更想知道的一些信息。

相关内容

  • 没有找到相关文章

最新更新