7

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

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

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

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

我知道他们cpp不知道变量、语法错误等;只有以(对)开头的东西#?但是枚举的成员具有固定大小,不能像 10(常量整数)值一样更改,并且编译器知道它的大小和值。那么,有没有可能进行这样的比较(就像我上面所做的那样)?我可以使用 gcc 扩展吗?

我不想用#defines 重写我所有的枚举,也不想花时间做一些宏的改变。

4

2 回答 2

7

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

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

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

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

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

GCC 将保持比较if

于 2012-11-02T16:11:43.290 回答
3

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

于 2012-11-02T16:03:41.307 回答