在C语言中定义枚举

在C语言中定义枚举,c,linux,enums,C,Linux,Enums,我有点惊讶下面的代码没有编译。你能解释一下吗?(头文件) 然后我得到以下错误: In file included from car.c:19:0: car.h:35:16: error: unknown type name ‘CarType_e’ 这是gcc 4.7.3版无论在何处使用,都需要说enum CarType_e: int build_car(enum CarType_e type); 或typedef枚举 typedef enum { CAR_BMW = 0, C

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

然后我得到以下错误:

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

这是gcc 4.7.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;

无论在何处使用,都需要说
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;
在C中,自定义类型(枚举、联合和结构)都有自己的命名范围

您需要编写
int build\u car(enum CarType\u e type)
这也意味着
\u e
后缀中没有任何意义

或者,您可以在C中使用
typedef

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

您需要编写
int build\u car(enum CarType\u e type)
这也意味着
\u e
后缀中没有任何意义


或者,您可以使用
typedef

您有两个选择,使用

typedef enum {
  CAR_BMW = 0,
  CAR_KIA,
  CAR_HONDA,
  CAR_FORD,
  CAR_MERCEDES
} CarType_e;
或者,您可以使用-

int build_car(enum CarType_e type);

我在linux上用gcc测试了这两种方法。

您有两种选择,使用

typedef enum {
  CAR_BMW = 0,
  CAR_KIA,
  CAR_HONDA,
  CAR_FORD,
  CAR_MERCEDES
} CarType_e;
或者,您可以使用-

int build_car(enum CarType_e type);

我在linux上用gcc测试了这两种方法。

您需要通过指定枚举的标记以及
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
,这是您非常想了解的一些信息。

您需要通过指定枚举标记和
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
,这是一些您非常想了解的信息。

有趣的是,我有一些类似于旧开发的代码,而且我在编译时从未遇到过问题。C版本之间可能有不同的行为吗?或者不同的编译器选项?否;它在不同的语言(C和C++)中有不同的行为。不要用C++编译器编译C,就像你不使用FORTRAN编译器编译C一样。有趣的是,我从旧开发中得到了一些类似的代码,而且编译时从来没有遇到过问题。C版本之间可能有不同的行为吗?或者不同的编译器选项?否;它在不同的语言(C和C++)中有不同的行为。不要用C++编译器编译C,就像你不使用FORTRAN编译器编译C一样。有趣的是,我从旧开发中得到了一些类似的代码,而且编译时从来没有遇到过问题。C版本之间可能有不同的行为吗?还是不同的编译器选项?@fazinero是的,可能是编译器选项(和/或命令-g++vs gcc)。有趣的是,我有一些类似于旧开发的代码,我从来没有遇到过编译问题。C版本之间可能有不同的行为吗?或者不同的编译器选项?@fazineroso是的,可能是编译器选项(和/或命令-g++vs gcc)。我如何通过指定标记告诉编译器使用枚举?你不能;标记名本身不是C语言中的类型(C++肯定不同)。但是,您可以使用
typedef enum{CAR,BIKE,ROCKET}vehicle创建一个类型
然后在您喜欢的任何地方使用类似于
int v
vehicle v
。从语法上讲,
vehicle
是一个typedef名称,而不是一个标记。我如何通过指定标记告诉编译器使用枚举?你不能;标记名本身不是C语言中的类型(C++肯定不同)。但是,您可以使用
typedef enum{CAR,BIKE,ROCKET}vehicle创建一个类型
然后在您喜欢的任何地方使用类似于
int v
vehicle v
。从语法上讲,
vehicle
是一个typedef名称,而不是标记。