7

コンパイル時に列挙型メンバーの値を取得することは可能ですか?

実際、私は次のようなことができるようになりたいです:

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

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

cpp変数や不適切な構文などについて知らないことは知っています。#(右)で始まるものだけ?ただし、列挙型のメンバーは固定サイズであり、10 (定数整数) 値のように変更することはできず、コンパイラーはそのサイズと値を認識しています。それで、そのような比較を行う可能性はありませんか(私が上で行ったように)?gcc 拡張を使用できますか?

sを使用してすべての列挙を書き直したく#defineないし、いくつかのマクロの変更に時間をかけたくありません。

4

2 に答える 2

7

を使用するだけifです。列挙型は、コンパイル時に問題なく評価できます。コンパイラは、不可能な分岐を最適化します。

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

コンパイラは、2 つの分岐 (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 に答える