このように定義された2つの列挙型があります
enum foo {
foo_a = 0x1,
foo_b = 0x2,
foo_c = 0x4,
foo_d = 0x8,
foo_e = 0x10,
..etc..
}
と
enum bar {
bar_a = 0x1,
bar_b = 0x2,
bar_c = 0x4,
bar_d = 0x8,
bar_e = 0x10,
..etc..
}
現在、foo_[az] と bar_[az] の間に 1 対 1 のマッピングがあり、すぐに調べたいと思います。これを行う明白な方法は、次のような宣言を行うことです
int table[][] = {
[foo_a] = bar_c,
[foo_b] = bar_a,
[foo_c] = bar_b,
..etc..
}
を使用して調べるだけですresult = table[(enum foo)temp]
。しかし、これらの列挙型はビットごとに宣言されているため、のサイズはtable
指数関数的に大きくなります。
コンパイル時に設定する簡単な方法はありますか?
私が何かをすることを考えた1つのこと
int table[][] = {
[LOG(foo_a)] = bar_c,
[LOG(foo_b)] = bar_a,
[LOG(foo_c)] = bar_b,
..etc..
}
これによりメモリのフットプリントが削減されますが、とにかくコンパイル時に LOG を計算することを知りません。
他の提案はありますか?
私の唯一の制限は次のとおりです。列挙型を変更するとバイナリの非互換性が発生するため、列挙型を変更することはできません。
編集:コンパイル時のソリューションが望ましい