0

プログラムに、さまざまな型のサイズを記述するルックアップ テーブルが必要です。今、私はそれを次のように取得しました:

typedef struct{
     APP_InterfaceType_t Type;  //This is just an enum
     uint8_t Size;
}APP_InterfacesLUT_t;

APP_InterfacesLUT_t MyLUT[] = {...}

ここでの問題は、異なる .h ファイルから LUT の内容を挿入したい (理由があります) ことです。これはプリプロセッサで行う必要があります。

別々の .h ファイルでさまざまなタイプを取得しました。ビルドにこれらの .h ファイルの 1 つを含めると、タイプ (.h ファイルに記述されている) とサイズが魔法のように LUT に表示されます。

.h ファイル内である種のマクロを呼び出すことでこれが可能かどうか疑問に思っていますか?

例えば:

REGISTERTYPE(type, size); 

編集: LUT が定義されているモジュールは、型について何も知りません。アイデアは、プログラムに新しいタイプを追加したいときは、ヘッダーファイルを含めるだけでよく、プログラムの残りの部分では何も編集しないということです:)

4

2 に答える 2

3

はい、可能ですが、おそらく複数の包含やifdefトリックを使用する必要があります。

X マクロも参照してください。ただし、複数のヘッダーで動作するように一般化する必要がある場合は、より複雑になります。

于 2013-10-16T09:31:19.287 に答える
1

LUT モジュールが他のモジュールを認識している場合は、条件付きコンパイルを実行できます。これには多くのアプローチがあります (アンワインドが指摘した X マクロなど) が、ここでは伝統的なものを示します。

APP_InterfacesLUT_t MyLUT[] = {
#ifdef MODULE_A
    { TYPE_1, 12 },
    { TYPE_2, 45 },
#endif
#ifdef MODULE_B
    { TYPE_2, 22 },
    { TYPE_3, 77 },
#endif
};

LUT モジュールが他のモジュールを認識していない場合、それを回避する方法はなく、実行時にこれを行う必要があります。

編集:

Xマクロソリューション。

LUT.c:

APP_InterfacesLUT_t MyLUT[] = {
    #define X(a, b, c)   { a, b },
    #include "interfaces.x"
    #undef X
};

インターフェイス.x:

// Molude A
X( TYPE_1, 12, something else )
X( TYPE_2, 45, something else )
// Molude B
X( TYPE_2, 22, something else )
X( TYPE_3, 77, something else )
于 2013-10-16T09:39:03.457 に答える