2

列挙子に関連付けられた情報やアクションにこれと同様の手法を使用しています。これはかなりうまく機能しますが、すべての定数を2回効果的にリストする必要があるという小さな問題があります。1回はenum宣言のヘッダーファイルに、もう1回はルックアップテーブルのソースファイルにあります。おそらくプリプロセッサのトリック(Boost.Preprocessorは許容されます)を使用して、列挙型定数や関連する値などを1か所に入力し、必要なものをすべて取得できるように「自動化」する良い方法があるかどうか疑問に思っています(おそらくルックアップ構造体自体も生成されます。

可能であれば、漠然と列挙型の構文を維持する方法をお勧めします。たとえば、のようなものDECLARE_ENUM(...) {E_CONST(...), E_CONST(...)};。これを実現するためにヘッダーファイルをダブルインクルードするというアイデアに言及しているサイトを見たことがあります。つまり、次のようなものです。

#include "my_enum.hpp"
#undef ENUM_HPP // undefine the include guard
#undef E_CONST
#define E_CONST(...) /* something here */
#include "my_enum.hpp"

...しかし、そのテクニックがここでどれほど役立つかはわかりません。特に、ヘッダーで定義されている列挙型だけではありません。ルックアップテーブル構造体も、他のいくつかの関連する列挙型とサポート関数とともにそこにあります。

私はすでにマクロを使用してルックアップテーブルの要素を定義しています(列挙型定数の順序を並べ替えてもエントリが常に正しい場所にあるように、C99初期化子を使用しています)。

複数の列挙型に適用できるソリューションもいいでしょう。

私はこれにclang(Apple-3.1)を使用しており、移植性については特に心配していません。

どこかで捨てようとしたのですが…なぜうまくいかなかったのか思い出せません。多分私はタイムマシンでそれを見つけることができます...

4

3 に答える 3

2

プリプロセッサのトリックを使用して、別のファイル(たとえば、enum_foo.def)で列挙型を定義します。#includedを取得するのは保護されていないファイルになります。

ENUM_FOO_DEF(ALPHA, 9, 2)
ENUM_FOO_DEF(BETA, 10, 3)
ENUM_FOO_DEF(GAMMA, 12, 7)
ENUM_FOO_DEF(DELTA, 13, 11)
//...

次に、ソースファイルで、次の行に沿って何かを実行します。

enum FooEnum {
    #define ENUM_FOO_DEF(X,Y,Z) FOO_E_ ## X,
    #include "enum_foo.def"
    #undef ENUM_FOO_DEF
    FOO_E_MAX
};

enumそして、属性のテーブルにデータを入力するのと同じようなことをすることができます。

于 2012-07-06T05:24:25.253 に答える
1

文字列列挙型の私の要点を見てください https://gist.github.com/3058317

于 2012-07-06T05:58:25.890 に答える
0

おそらく、名前と関連する値を含むデータファイルを取得し、おそらくスタンドアロンCモジュールとしてヘッダーファイルとデータテーブルを生成する独自のコードジェネレーターを作成する必要があります。

このプログラムは簡単に作成できますが、非常に強力に使用できます。

于 2012-07-06T05:06:18.820 に答える