检查是否在C枚举中定义了值?

检查是否在C枚举中定义了值?,c,enums,C,Enums,假设我有: enum{A=0x2E,B=0x23,C=0x40} 可以检查x是否定义在enum中 我是手工操作的:intisdef=(x==A | | x==B | | x==C)但我想要更具动态性的东西GCC扩展也很受欢迎。据我所知不是这样。C中的枚举只是一系列 #define A 0x2E 声明 如果枚举较大且其值恰好是连续的,请声明最小/最大常量并与以下常量进行比较: enum { E_MIN = 0x2E, A = 0x2E, B = 0x23, C = 0x40 ..., E_MAX

假设我有:

enum{A=0x2E,B=0x23,C=0x40}

可以检查
x
是否定义在
enum


我是手工操作的:
intisdef=(x==A | | x==B | | x==C)但我想要更具动态性的东西<代码>GCC扩展也很受欢迎。

据我所知不是这样。C中的枚举只是一系列

#define A 0x2E
声明

如果枚举较大且其值恰好是连续的,请声明最小/最大常量并与以下常量进行比较:

enum { E_MIN = 0x2E, A = 0x2E, B = 0x23, C = 0x40 ..., E_MAX=0x100};

if(x >= MIN && x <= MAX)
    ItsInEnum();
enum{E_MIN=0x2E,A=0x2E,B=0x23,C=0x40…,E_MAX=0x100};

如果(x>=MIN&&x这是您问题的一种修改版本,但取决于您正在做什么,类似的操作可能会起作用:

enum {A,B,C};
const int E[] = {0x2E,0x23,0x40};
// Or:
// enum { A = 0x2E, B = 0x23, C = 0x40 };
// const int E[] = {A,B,C};

int isEnum(int x)
{
    for(int i=0; i<(sizeof(E)/sizeof(*E)); i++)
    {
        if(E[i] == x){ return 1; }
    }
    return 0;
}

int main(void)
{
    printf("Value of A: 0x%02x\n", E[A]);
    // Or:   
    // printf("Value of A: 0x%02x\n", A);

    printf("isEnum(0x2e): %s\n", isEnum(0x2e) ? "true" : "false");
    printf("isEnum(0x2f): %s\n", isEnum(0x2f) ? "true" : "false");
}
enum{A,B,C};
常数int E[]={0x2E,0x23,0x40};
//或:
//枚举{A=0x2E,B=0x23,C=0x40};
//常数int E[]={A,B,C};
整数isEnum(整数x)
{

for(int i=0;ia
enum
本质上与使用宏定义常量相同,只是
enum
将一组相关常量包装到一个数据类型中。这使您的代码更加自我记录,但实际上不提供任何附加功能


如果您在标准C之外冒险,一些编译器可以使用
enum
执行宏无法执行的额外操作。一些调试器将
enum
变量映射回它们的名称,而不是显示它们的值。此外,一些编译器还提供了添加运行时检查的功能,例如越界
enum
值。这与您显示的代码基本相同,只是编译器会自动添加它。对于GreenHills的C编译器,此功能是通过
-check=assignbound
编译器选项启用的。我不确定gcc是否具有类似于此的内置功能。您使用的编译器是什么?

来扩展已接受的answer,使用X宏使用预处理器从相同的数据构建枚举和数组

/* Only need to define values here. */
#define ENUM_VALUES \
    X(A, 0x2E)  \
    X(B, 0x23)  \
    X(C, 0x40)

/* Preprocessor builds enum for you */
#define X(a, b) a = b,
    enum {
        ENUM_VALUES
    };
#undef X

/* Preprocessor builds array for you */
#define X(a, b) a,
    const int E[] = {
        ENUM_VALUES
    };
#undef X

/* Copied from accepted answer */
int isEnum(int x)
{
    for(int i=0; i<sizeof(E);i++)
    {
        if(E[i] == x){ return 1; }
    }
    return 0;
}
/*只需在此处定义值*/
#定义枚举值\
X(A,0x2E)\
X(B,0x23)\
X(C,0x40)
/*预处理器为您构建枚举*/
#定义X(a,b)a=b,
枚举{
枚举值
};
#未定义X
/*预处理器为您构建数组*/
#定义X(a,b)a,
常数整数E[]={
枚举值
};
#未定义X
/*抄袭已接受的答案*/
整数isEnum(整数x)
{

对于(int i=0;i而言,最简单的方法是:



如前所述,无法通过直接引用枚举成员来检查枚举是否已定义。但是,有一个非常简单的快捷方式:定义与每个枚举类型关联的唯一标识符。然后,当您要检查枚举元素是否存在时,只需检查关联的标识符是否存在定义:

//Header File:
typedef enum 
{
   ENUM_ELEMENT_1 = 0,
   ENUM_ELEMENT_2 = 1,
   ENUM_ELEMENT_3 = 2,
   ENUM_ELEMENT_MAX
} eEnumElement;

#define ENUM_ELEMENT_DEFINED  1


以下是另一种可能的解决方案:

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

typedef enum {
  VALUE_1 = 0x01,
  VALUE_2 = 0x03,
  VALUE_3 = 0x0A
} values_e;

int main(void)
{
  int a = 0;
  values_e vlr;

  for (int i = 0; i < 10; i++) {
    scanf("%d", &a);

    vlr = (values_e)a;
    switch (vlr) {
      case VALUE_1:
        printf("do ... value 1:\r\n");
        break;

      case VALUE_2:
        printf("do ... value 2:\r\n");
        break;

      case VALUE_3:
        printf("do ... value 3:\r\n");
        break;

      default:
        printf("ops...\r\n");
    }
  }
}
#包括
#包括
类型定义枚举{
值_1=0x01,
值_2=0x03,
值_3=0x0A
}价值观;
内部主(空)
{
int a=0;
价值观;
对于(int i=0;i<10;i++){
scanf(“%d”和“&a”);
vlr=(值_e)a;
开关(vlr){
案例值_1:
printf(“do…值1:\r\n”);
打破
案例值_2:
printf(“do…值2:\r\n”);
打破
案例值_3:
printf(“do…值3:\r\n”);
打破
违约:
printf(“操作…\r\n”);
}
}
}

如果值是不连续的,可以将它们放入常量数组(排序)然后快速进行二进制搜索以查找是否存在。由于枚举是编译时常量,您甚至可以设计一个完美的哈希函数,并在常量时间内找到答案。哈希计算时间可能与手动比较时间相当。对于枚举,大N行为与IMHO无关。感谢您的回答!
E_MIN
E#u MAX
是一个很好的解决方案;但是值不是连续的,所以我不能使用它。关于你的第一个语句,如果
a
是在枚举中定义的,那么
a
的等价物是什么?不,你可能需要使用其他类似set+1的东西。我还将使用x-macro来生成枚举和E[]-不需要手动同步这两个数据结构。不应该是
(sizeof(E)/sizeof(*E))
,而应该是
sizeof(E)
?@frarugi87,谢谢,很好!我看到我从另一个答案复制的部分已经被编辑,包含了您在这里引用的代码段。是的,您是对的。
//Header File:
typedef enum 
{
   ENUM_ELEMENT_1 = 0,
   ENUM_ELEMENT_2 = 1,
   ENUM_ELEMENT_3 = 2,
   ENUM_ELEMENT_MAX
} eEnumElement;

#define ENUM_ELEMENT_DEFINED  1
//Source file:
void TaskOperateOnEnums(void) 
{
   #if defined(ENUM_ELEMENT_DEFINED)
   eEnumElement Test = ENUM_ELEMENT_1;
   ...
   #endif
}
#include <stdio.h>
#include <stdint.h>

typedef enum {
  VALUE_1 = 0x01,
  VALUE_2 = 0x03,
  VALUE_3 = 0x0A
} values_e;

int main(void)
{
  int a = 0;
  values_e vlr;

  for (int i = 0; i < 10; i++) {
    scanf("%d", &a);

    vlr = (values_e)a;
    switch (vlr) {
      case VALUE_1:
        printf("do ... value 1:\r\n");
        break;

      case VALUE_2:
        printf("do ... value 2:\r\n");
        break;

      case VALUE_3:
        printf("do ... value 3:\r\n");
        break;

      default:
        printf("ops...\r\n");
    }
  }
}