假设我们定义这样一个枚举,枚举里的内容并非是连续的顺序:
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