2012-11-02 36 views
7

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

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

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

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

我知道cpp不知道的变量,语法错误等;只有以#(右)开头的东西?但枚举的成员具有固定大小,不能像10(常量整数)值一样更改,编译器知道它的大小和值。那么,是否没有可能做这样的比较(就像我上面所做的那样)? gcc-extensions也非常赞赏。

这只是一个尝试,不要用#define s来重写我所有的枚举,也不要花时间去做一些宏的改变。

+1

你在'#if'块中想要做什么? – ecatmur

+0

不能想到任何实际的用例,这是有用的.. –

+0

[enum和#define](http://stackoverflow.com/questions/136946/difference-between-enum-and-define-statements) – SparKot

回答

7

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

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

编译器知道其两个分支(A和B)的无法到达,所以可以完全消除if

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

​​

GCC将保持if比较。

+0

非常好。我会尝试一下。你有这样的优化细节的链接? (我们正在谈论的gcc?) – Jack

+1

看到这个想法:http://stackoverflow.com/questions/11281471/disable-if0-elimination-in-gcc你甚至不必让优化器得到这个行为。用'-O2 -S'编译一个示例程序来获取程序集文件。你会看到没有分支。 –

+0

非常感谢。你拯救了我的一天。 :) – Jack

3

#ifdef由预处理器解释而不是由编译器解释。预处理器不知道任何有关enums的值。所以这不是一种方法。