我有点惊讶以下代码无法编译。你能说清楚吗? (头文件)
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
答案 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
- 这是您想要了解的一些信息。