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 
#include 

#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

更多内容请关注公众号
C语言判断一个值是否在枚举里_第1张图片

你可能感兴趣的:(C,c语言)