在编译时可以获得枚举成员的值吗?

时间:2012-11-02 16:01:18

标签: c gcc enums c-preprocessor

可以在编译时获取枚举成员的值吗?

事实上,我希望能够做到这样的事情:

enum { 
   FOO_FIRST = -1,
   FOO_A,
   FOO_B,
   FOO_C,
   FOO_LAST
};

#if FOO_LAST > 10
//...
#else
//..
#endif

我知道cpp不知道变量,语法错误等;只有以#(右)开头的东西?但是枚举的成员具有固定大小,并且不能像10(常数整数)值那样进行更改,并且编译器知道其大小和值。所以,没有任何可能做这样的比较(如上所述)? gcc-extensions也非常受欢迎。

这只是尝试不使用#define重写所有枚举,并且不花时间做一些宏更改。

2 个答案:

答案 0 :(得分:7)

只需使用if即可。枚举可以在编译时进行评估。编译器将优化不可能的分支:

if (FOO_LAST > 10) {
    // A
} else {
    // B
}

编译器知道无法到达两个分支(A和B)中的哪一个,因此它可以完全消除if

但请注意,您应该只直接使用枚举器。例如,在此:

int num = FOO_LAST;
if (num > 10) {
    // A
} else {
    // B
}

GCC将保持 if比较。

答案 1 :(得分:3)

#ifdef由预处理器解释,而不是由编译器解释。预处理器对enums的值一无所知。所以这不是一种方法。