Wie kann ich eine dynamische Versandtabelle in C implementieren?

Zunächst verstehe ich, wie man eine Dispatch-Tabelle mit Funktionszeigern und einer Zeichenfolge oder einer anderen Suche implementiert, das ist nicht die Herausforderung.

Ich suche nach einer Möglichkeit, Einträge dynamisch zu dieser Tabelle hinzuzufügenzur Kompilierzeit.

Die Art der Codestruktur, die ich mir erhoffe, ist ungefähr so:

Strategy.h - Enthält die Funktionsdefinition für den Dispatcher und die Dispatcher-Tabellendefinition Strategy.c - Enthält den Code für den Dispatcher

MyFirstStrategy.c - beinhaltet Strategy.h und bietet eine Implementierung der Strategie MyOtherStrategy.c - beinhaltet Strategy.h und bietet eine zweite Implementierung der Strategie

Die Idee ist, dass der Code zum Einfügen von Funktionszeigern und Strategie-Namen in die Dispatch-Tabelle nicht in Strategy.c, sondern in den einzelnen Strategie-Implementierungsdateien gespeichert und die Lookup-Tabelle zum Zeitpunkt der Kompilierung dynamisch erstellt werden sollte.

Für eine Versandtabelle mit fester Größe könnte dies wie folgt verwaltet werden, aber ich möchte eine Tabelle mit dynamischer Größe, ich möchte nicht, dass die Strategy.c-Implementierung alle Header-Dateien für die Implementierungen enthalten muss und ich möchte den Versand Tabelle, die zur Kompilierungszeit erstellt werden soll, nicht zur Laufzeit.

Beispiel für feste Größe

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] );

Was ich wirklich will, ist eine Präprozessor-Magie, die ich in die Strategie-Implementierungsdateien einfügen kann, um dies automatisch zu handhaben, z.

MyFirstStrategy.c
#include "Strategy.h"

void firstStrategy( int param );

ADD_TO_DISPATCH_TABLE( "First Strategy", firstStrategy );

Irgendwelche Gedanken?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage