まず第一に、関数ポインターと文字列またはその他のルックアップを使用してディスパッチ テーブルを実装する方法を理解しています。それは難しいことではありません。
私が探しているのは、コンパイル時にこのテーブルにエントリを動的に追加する方法です。
私が望むコード構造のタイプは次のようなものです。
Strategy.h - ディスパッチャの関数定義とディスパッチ テーブル定義が含まれています Strategy.c - ディスパッチャのコードが含まれています
MyFirstStrategy.c - Strategy.h を含み、戦略の 1 つの実装を提供します MyOtherStrategy.c - Strategy.h を含み、戦略の 2 番目の実装を提供します
関数ポインターとストラテジー名をディスパッチ テーブルに挿入するコードは、Strategy.c ではなく、個々のストラテジー実装ファイルに配置する必要があり、ルックアップ テーブルはコンパイル時に何らかの方法で動的に構築する必要があります。
固定サイズのディスパッチ テーブルの場合、これは以下のように管理できますが、動的なサイズのテーブルが必要です。Strategy.c 実装に実装のすべてのヘッダー ファイルを含める必要はなく、ディスパッチが必要ですテーブルは、実行時ではなくコンパイル時に構築されます。
固定サイズの例
Strategy.h
typedef void strategy_fn_t(int);
typedef struct {
char *strategyName;
strategy_fn_t *implementation;
} dispatchTableEntry_t;
MyFirstStrategy.h
#include "Strategy.h"
void firstStrategy( int param );
MyOtherStrategy.h
#include "Strategy.h"
void otherStrategy( int param );
Strategy.c
#include "Strategy.h"
#include "MyFirstStrategy.h"
#include "MyOtherStrategy.h"
dispatchTableEntry_t dispatchTable[] = {
{ "First Strategy", firstStrategy },
{ "Other Strategy", otherStrategy }
};
int numStrategies = sizeof( dispatchTable ) / sizeof(dispatchTable[0] );
私が本当に欲しいのは、これを自動的に処理するために戦略実装ファイルに挿入できるプリプロセッサ マジックです。
MyFirstStrategy.c
#include "Strategy.h"
void firstStrategy( int param );
ADD_TO_DISPATCH_TABLE( "First Strategy", firstStrategy );
何かご意見は ?