C语言判断一个值是否在枚举里

假设我们定义这样一个枚举,枚举里的内容并非是连续的顺序:

typedef enum
{
    SCAN = 1,
    READY = 5,
    ADV = 7,
    CONN = 18,
    INIT = 20,
}State_e;

此时如果有一个值state,如何判断state是否属于枚举中的内容呢?

通常我们会用switch-case来判断state是否属于枚举中的内容,代码如下:

switch(state)
{
    case SCAN:
    case READY:
    case ADV:
    case CONN:
    case INIT:
        return true;
    default:
        return False:
}

这样做是可以达到我们的目的的,但是如果我们的枚举内容很多,这里的代码就会写的很长,而且如果枚举的内容有新增或是删除,这里也要一并修改,比较麻烦,那有没有什么方式能够规避这些弊端吗?


使用X-Macro就可以实现了,具体如下:

#include <stdio.h>
#include <stdint.h>

#define STATE_TAB 	\
		X_MACRO(SCAN, 		1)		\
		X_MACRO(READY, 	    5)		\
		X_MACRO(ADV, 		7)		\
		X_MACRO(CONN, 		18)		\
		X_MACRO(INIT, 		20)


typedef enum
{
    #define X_MACRO(a, b) a = b,
	STATE_TAB
	#undef X_MACRO
}State_e;


static int is_valid(int state)
{
    int rst = -1;
    switch (state)
    {
        #define X_MACRO(a, b) case a:
            STATE_TAB
        #undef X_MACRO
            rst = 1;
            break;
        default:
            rst = -0;
    }
    return rst;
}

void main(void)
{
    int state = 5;
    printf("%d is valid: %d\r\n", state, is_valid(state));

    state = 30;
    printf("%d is valid: %d\r\n", state, is_valid(state));

    state = 18;
    printf("%d is valid: %d\r\n", state, is_valid(state));

    state = 2;
    printf("%d is valid: %d\r\n", state, is_valid(state));
}

输出如下:

5 is valid: 1
30 is valid: 0
18 is valid: 1
2 is valid: 0

更多内容请关注公众号
在这里插入图片描述

  • 9
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值