在C中定义枚举

时间:2014-03-26 15:33:25

标签: c linux enums

我有点惊讶以下代码无法编译。你能说清楚吗? (头文件)

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’

这是gcc版本4.7.3

4 个答案:

答案 0 :(得分:6)

您有两个选择,使用

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

或者,您可以使用 -

int build_car(enum CarType_e type);

我在linux上用gcc测试了两个。

答案 1 :(得分:3)

无论您在何处使用,都需要说enum CarType_e

int build_car(enum CarType_e type);

typedef枚举。

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

答案 2 :(得分:3)

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

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

或者,您可以使用typedef

答案 3 :(得分:2)

您需要通过指定标记以及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);

使编译器不明确。

并且不要为结构/联合而烦恼typedef;他们没用了,只有未被启发的人才会考虑他们。是的,这是一个强烈的意见。他们所做的只是让您免于在一些地方写struct - 这是您想要了解的一些信息。

相关问题