在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名称,而不是标记。