在c中定义一个enum类型很容易:
enum _pet_type{DOG, CAT, COW};
但是使用为了方便,可以使用typedef来定义:
typedef enum _pet_type{DOG, CAT, COW} pet_type;
这样就可以直接这样使用了:pet_type type = DOG;
1. 关于枚举数值
在这样的定义中,DOG被赋予了整型值0,后面的依次加1。你可以指定某一项元素的整数值,其后的元素依然是依次加1。
比如 typedef enum _pet_type{DOG, CAT = 10, COW} pet_type;
则DOG的值是0, CAT是10, COW是11。
2. 枚举数值与字符串的互换?
关于enum经常遇到的一个问题是,需要在字符串和整数值之间进行转换。比如遇到了枚举类型DOG,想显示字符串“DOG”,而不是数字? 拿到一个字符串“DOG”,怎样才能转换成枚举类型DOG,或者整数0?
了解了enum的原理,会发现直接转换不太可能. 因为c中enum类似与宏,比如定义了#define DOG 0,这样编译预处理时已经把所有的DOG替换成了0。enum与之类似, 每个枚举的符号(DOG、CAT、COW)都会被替换成数字,这样在运行期,只存在数字0、1、2,而完全没有了任何枚举符号DOG、CAT等的信息。所以想做一些简单直接的转换是不可能的,只能自己来写。
比如,从枚举类型得到对应的字符串,手工写一个转换函数:
static char *enum_to_name(pet_type type){
switch(type){
case DOG:
return "DOG";
case CAT:
return "CAT";
case COW:
return "COW";
default:
return NULL;
}
}
int main (int argc, char const *argv[])
{
char *name = enum_to_name(DOG);
printf("DOG name is \"%s\"\n", name);
return 0;
}
同样的,可以写从字符串到枚举数字的转换函数。当然,如果枚举类型比较多,而且所有枚举值是连续的话,可以写的简单一点:
typedef enum _pet_type{DOG, CAT, COW}pet_type;
static pet_type get_pet_type(char *data){
char map[][4] = {"DOG", "CAT", "COW"};
int i;
for (i = 0; i < 3; ++i)
{
if (strcmp (map[i], data) == 0)
{
return i;
}
}
return -1;
}
int main (int argc, char const *argv[])
{
pet_type type = get_pet_type("DOG");
printf("\"DOG\" type is %d\n", type);
return 0;
}
3. 在enum中定义ENUM_COUNT
有时候会使用枚举类型的数量,可能与硬编码。此时,可以在enum时定义一个元素ENUM_COUNT。由于默认情况下对应的整数值自动加1,所以这个值恰好代表了enum类型的数量:
typedef enum _pet_type{DOG, CAT, COW, PET_COUNT}pet_type;
这样如果对枚举类型进行增删,所有的PET_COUNT的引用不需要进行修改。
分享到:
相关推荐
在Java编程语言中,枚举(enum)是一种特殊的类,用于定义一组固定的常量。它在许多场景下比使用常量或int类型的硬编码值更安全、更具可读性。本篇文章将深入探讨Java枚举的特性、用法以及如何在实际开发中充分利用...
// define a simple enum (automatically flaggable -> A: 0x01, B: 0x02, C: 0x04) //Uses bitwise 'OR' operation in between the values and creates enumerated constants. For example, if 'Read':1, 'Write':2...
Did you know many expert developers have started with learning C in order to become knowledgeable in computer programming? Were you aware that your children are learning C Programming today in their ...
编译原理PL0源码(C语言版) /*** PL0 COMPILER WITH CODE GENERATION ***/ //--------------------------------------------------------------------------- #include #pragma hdrstop #include "Unit1.h" //----...
foreach (var field in fields) { var attribute = field.GetCustomAttribute(); if (attribute == null) continue; if (key == attribute.Description) { var obj = (Target)field.GetValue(typeof(Target))...
### Objective-C编程(第6版) —— Programming in Objective-C #### 书籍概述 《Objective-C编程(第6版)》是由Stephen G. Kochan编写的权威指南,旨在为程序员提供学习Objective-C语言所需的全部基础知识。该书由...
Learn the all basics and advanced features of C programming in no time from Bestselling Programming Author Harry. H. Chaudhary. This Book, starts with the basics; I promise this book will make you ...
《NSHipster Obscure Topics in Cocoa & Objective-C》是Mattt Thompson撰写的一本书,它深入探讨了Cocoa和Objective-C编程中一些不为人知的主题和高级概念。这本书不仅涵盖了Objective-C的基础知识点,还涉及了...
C's efficiency makes it a popular choice in a wide variety of applications and operating systems with special applicability to, for instance, wearables, game programming, system level programming, ...
Did you know many expert developers have started with learning C in order to become knowledgeable in computer programming? Were you aware that grade schools and high schools have begun implementing C...
- 函数的定义包括返回类型、函数名和参数列表,如`int inc(int a)`定义了一个返回`int`类型并接受`int`参数的函数。 - 函数的调用涉及到函数名和实际传入的参数,如`show(multi,10,&a)`。 6. 函数指针和回调函数 - ...
typedef enum {STATE_A, STATE_B, STATE_C} State; State currentState = STATE_A; void processInput(int input) { switch(currentState) { case STATE_A: // 处理STATE_A状态的逻辑 if (/* 条件满足 */) { ...
标题“NSHIPSTER: Obscure Topics In Cocoa & Objective-C”指出了本书的内容方向,即深入探讨Cocoa和Objective-C中的不那么明显但重要的主题。Cocoa是苹果公司为其Mac OS X操作系统开发的应用程序框架,而Objective...
30. Enum syntax error — 枚举类型语法错误 枚举声明中的语法有误。 31. Bad suffix on number — 数字的下标错误 给数字添加了不合法的后缀,如使用了不支持的字符。 理解这些C语言中的常见错误,并在编程时避免...
Learn the all basics and advanced features of C programming in no time from Bestselling Programming Author Harry. H. Chaudhary. This Book, starts with the basics; I promise this book will make you ...
例如:这里程序文件开头有如下#define语句 代码如下: #define N 10 #define PI 3.14 #define MAX 10000 #define Heigth 6.65 … … 假设这里程序运行出错误,而且就是在我们使用这些常量有错误,此时编辑器应该会抛...
例如,`a + b * c`可以写成`(a + b) * c`或`a + (b * c)` Ambiguous symbol 在C语言中,我们可能会使用一些ambiguous symbol,例如`i`可能是整数也可能是浮点数。这时候我们需要使用明确的类型说明符来避免错误。 ...
28. **Enum syntax error** 和 **Enumeration constant syntax error**:枚举类型或枚举常量的语法错误,检查枚举的定义是否正确。 29. **Error directive :xxx**:错误的编译预处理指令,错误号为`xxx`。 30. **...
Enum syntax error (枚举语法错误) 当定义枚举时语法不正确时,会报此错误。例如,忘记使用大括号 `{}` 包围枚举值。解决方法是检查枚举定义的语法是否正确。 #### 31. Enumeration constant syntax error (枚举...
typedef enum {Link, Thread} PointerTag; // 指针类型 typedef struct node { DataType data; // 数据域 PointerTag ltag, rtag; // 左右标志位 struct node *lchild, *rchild; // 左右孩子指针 } BinTNode; ...