`
aqingsao
  • 浏览: 174785 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

enum in c

阅读更多

在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-Java枚举类型 enum 应用详解

    在Java编程语言中,枚举(enum)是一种特殊的类,用于定义一组固定的常量。它在许多场景下比使用常量或int类型的硬编码值更安全、更具可读性。本篇文章将深入探讨Java枚举的特性、用法以及如何在实际开发中充分利用...

    enum-props:枚举,支持其他元数据

    // define a simple enum (automatically flaggable -&gt; 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...

    C.Programming.Step.By.Step.Beginners.To.Experts.Edition.B011EXMV7Q

    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源码(C语言版) /*** PL0 COMPILER WITH CODE GENERATION ***/ //--------------------------------------------------------------------------- #include #pragma hdrstop #include "Unit1.h" //----...

    c# 怎样简洁高效的实现多个 Enum 自由转换

    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版) —— Programming in Objective-C #### 书籍概述 《Objective-C编程(第6版)》是由Stephen G. Kochan编写的权威指南,旨在为程序员提供学习Objective-C语言所需的全部基础知识。该书由...

    C.in.Depth.Easy.Beginners.To.Experts.Guide.1500481033

    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

    《NSHipster Obscure Topics in Cocoa & Objective-C》是Mattt Thompson撰写的一本书,它深入探讨了Cocoa和Objective-C编程中一些不为人知的主题和高级概念。这本书不仅涵盖了Objective-C的基础知识点,还涉及了...

    C.Quick.Syntax.Reference

    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, ...

    C.Programming.Professional.For.Beginners.B011A2PX30

    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...

    华为C语言笔试题.pdf

    - 函数的定义包括返回类型、函数名和参数列表,如`int inc(int a)`定义了一个返回`int`类型并接受`int`参数的函数。 - 函数的调用涉及到函数名和实际传入的参数,如`show(multi,10,&a)`。 6. 函数指针和回调函数 - ...

    C语言实现的状态机

    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

    标题“NSHIPSTER: Obscure Topics In Cocoa & Objective-C”指出了本书的内容方向,即深入探讨Cocoa和Objective-C中的不那么明显但重要的主题。Cocoa是苹果公司为其Mac OS X操作系统开发的应用程序框架,而Objective...

    C语言的错误提醒及其中文翻译

    30. Enum syntax error — 枚举类型语法错误 枚举声明中的语法有误。 31. Bad suffix on number — 数字的下标错误 给数字添加了不合法的后缀,如使用了不支持的字符。 理解这些C语言中的常见错误,并在编程时避免...

    C.Programming.The.Ultimate.Way.to.Learn.C.1500481114

    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 ...

    c++ 尽量不要使用#define 而是用const、enum、inline替换。

    例如:这里程序文件开头有如下#define语句 代码如下: #define N 10 #define PI 3.14 #define MAX 10000 #define Heigth 6.65 … … 假设这里程序运行出错误,而且就是在我们使用这些常量有错误,此时编辑器应该会抛...

    C语言常见错误查询,查询运行时出现的错误

    例如,`a + b * c`可以写成`(a + b) * c`或`a + (b * c)` Ambiguous symbol 在C语言中,我们可能会使用一些ambiguous symbol,例如`i`可能是整数也可能是浮点数。这时候我们需要使用明确的类型说明符来避免错误。 ...

    常见C语言错误提示信息.doc

    28. **Enum syntax error** 和 **Enumeration constant syntax error**:枚举类型或枚举常量的语法错误,检查枚举的定义是否正确。 29. **Error directive :xxx**:错误的编译预处理指令,错误号为`xxx`。 30. **...

    最全的c语言错误提示

    Enum syntax error (枚举语法错误) 当定义枚举时语法不正确时,会报此错误。例如,忘记使用大括号 `{}` 包围枚举值。解决方法是检查枚举定义的语法是否正确。 #### 31. Enumeration constant syntax error (枚举...

    中序线索二叉树详细讲解及c语言代码.txt

    typedef enum {Link, Thread} PointerTag; // 指针类型 typedef struct node { DataType data; // 数据域 PointerTag ltag, rtag; // 左右标志位 struct node *lchild, *rchild; // 左右孩子指针 } BinTNode; ...

Global site tag (gtag.js) - Google Analytics