如何在C语言中定义枚举类型(enum)?
问题的出现原因是在声明 strategy
变量时重复声明了它,导致出现了上述错误。以下代码可以正常运行而不会有任何警告(使用 gcc -ansi -pedantic -Wall
编译):
#includeenum { RANDOM, IMMEDIATE, SEARCH } strategy = IMMEDIATE; int main(int argc, char** argv){ printf("strategy: %d\n", strategy); return 0; }
如果将上面的第二行改为以下代码:
... enum { RANDOM, IMMEDIATE, SEARCH } strategy; strategy = IMMEDIATE; ...
从警告信息中可以清楚地看出错误:
enums.c:5:1: warning: data definition has no type or storage class [enabled by default] enums.c:5:1: warning: type defaults to ‘int’ in declaration of ‘strategy’ [-Wimplicit-int] enums.c:5:1: error: conflicting types for ‘strategy’ enums.c:4:36: note: previous declaration of ‘strategy’ was here
编译器将 strategy = IMMEDIATE
视为一个名为 strategy
的变量的声明,默认类型为 int
,但是已经有一个之前声明了同名变量。
然而,如果将赋值语句放在 main()
函数中,那么这段代码就是有效的:
#includeenum { RANDOM, IMMEDIATE, SEARCH } strategy = IMMEDIATE; int main(int argc, char** argv){ strategy=SEARCH; printf("strategy: %d\n", strategy); return 0; }
在C语言中,我们可以使用enum
来定义枚举类型。使用enum
可以为一组相关的常量赋予一个有意义的名称,并且可以更方便地使用这些常量。
在C语言中,声明一个enum
变量的方法如下:
enum strategy {RANDOM, IMMEDIATE, SEARCH}; enum strategy my_strategy = IMMEDIATE;
这样就定义了一个名为strategy
的枚举类型,并且创建了一个名为my_strategy
的变量并初始化为IMMEDIATE
。
然而,我们还可以使用typedef
来缩短变量声明的代码,如下所示:
typedef enum {RANDOM, IMMEDIATE, SEARCH} strategy; strategy my_strategy = IMMEDIATE;
这样就定义了一个名为strategy
的枚举类型,并且创建了一个名为my_strategy
的变量并初始化为IMMEDIATE
。
为了区分类型和变量,使用命名约定是一个不错的做法:
typedef enum {RANDOM, IMMEDIATE, SEARCH} strategy_type; strategy_type my_strategy = IMMEDIATE;
这样我们定义了一个名为strategy_type
的枚举类型,并且创建了一个名为my_strategy
的变量并初始化为IMMEDIATE
。
但是,问题的提问者希望使用一个匿名的枚举类型来定义变量。
他问道:难道我不能只是声明enum MyEnum {} myVar;
然后像这样使用变量myVar
:myVar = SOMEENUMCONSTANT;
吗?
然而,在C语言中,我们无法直接声明一个匿名的枚举类型并创建变量。
为了解决这个问题,我们需要为枚举类型指定一个名称,如strategy_type
,然后使用这个名称来定义变量。这样我们就可以方便地使用枚举类型和变量了。
在C语言中,如何定义一个枚举类型(enum)?这个问题的出现是因为有人想知道在C语言中如何正确定义枚举类型。以下是解决该问题的方法:
在C语言中,可以使用以下方法定义枚举类型,无需使用typedef:
enum strategy { RANDOM, IMMEDIATE, SEARCH }; enum strategy my_strategy = IMMEDIATE;
这种方法相对冗长,但是将类型标识符放入标签命名空间中,不会与普通标识符冲突(类似于`struct stat`和`stat`函数的关系),并且可以立即看出它是一个类型。
另一种更简洁的方法是使用typedef:
typedef enum strategy { RANDOM, IMMEDIATE, SEARCH } strategy_t; strategy_t my_strategy = IMMEDIATE;
这种方法更简短,但是将类型标识符放入普通命名空间中。
需要注意的是,上面的代码在C语言中是有效的,在C++中也可以使用类似的方法。
除了上述方法外,还有其他一些方法可以定义枚举类型,例如:
enum strategy { RANDOM, IMMEDIATE, SEARCH };
这种方法也是有效的,在需要使用枚举类型的实例时,可以这样声明变量:
enum strategy myEnum;
需要注意的是,不要使用`*_t`作为类型名,因为这些类型名在POSIX中是保留的。
以上就是如何在C语言中定义枚举类型的几种方法。不同的方法有各自的优缺点,开发者可以根据自己的需求选择合适的方法。