我有点惊讶下面的代码不能编译。你能解释一下吗?(头文件)
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
——这是您更想知道的一些信息。