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

Jac*_*ack 11 c enums

假设我有这个:

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

可以检查是否x定义了enum

我是手动完成的:int isdef = (x == A || x == B || x == C);但我想要更有活力的东西.GCC-extensions也欢迎.

Sev*_*yev 13

不是我所知道的.C中的枚举只是一系列更清晰的替代品

#define A 0x2E
Run Code Online (Sandbox Code Playgroud)

声明.

如果枚举很大并且其值恰好是连续的,则声明最小/最大常量并与之比较:

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

if(x >= MIN && x <= MAX)
    ItsInEnum();
Run Code Online (Sandbox Code Playgroud)

  • 如果值是不连续的,您可以将它们放在一个常量数组(已排序)中并进行快速二进制搜索以查找它是否在那里. (4认同)
  • 感谢您的回答!`E_MIN`和`E_MAX`是一个非常好的解决方案; 但值不是连续的,所以我不能使用它. (2认同)

jed*_*rds 10

这是你问题的修改版本,但根据你正在做的事情,这样的事情可能有效:

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");
}
Run Code Online (Sandbox Code Playgroud)

哪个输出

Value of A: 0x2e
isEnum(0x2e): true
isEnum(0x2f): false

编辑:TJD打败了我,他建议使用排序数组并进行二分查找会减少你从n到log(n)的搜索时间.


Aar*_*son 5

要扩展接受的答案,请使用X-macros使用预处理器从相同数据构建枚举和数组。

/* 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;
}
Run Code Online (Sandbox Code Playgroud)


小智 5

最简单的方法是:


enum {
    MODE_A,
    MODE_B,
    MODE_C
};

int modeValid(int mode)
{
    int valid = 0;

    switch(mode) {
        case MODE_A:
        case MODE_B:
        case MODE_C:
            valid = 1;
    };

    return valid;
}

void setMode(int mode)
{
    if (modeValid(mode)) {
        // Blah, blah
    }
}

int main(void)
{
    setMode(1);   // Okay
    setMode(500); // Error
}
Run Code Online (Sandbox Code Playgroud)