Jak mogę zaimplementować dynamiczną tabelę wysyłek w C

Po pierwsze, rozumiem, jak zaimplementować tablicę dyspozycyjną za pomocą wskaźników funkcji i łańcucha lub innego wyszukiwania, co nie jest wyzwaniem.

To, czego szukam, to sposób na dynamiczne dodawanie wpisów do tej tabeliw czasie kompilacji.

Typ struktury kodu, na który mam nadzieję, to coś w rodzaju:

Strategia.h - zawiera definicję funkcji dla dyspozytora i definicję tabeli wysyłki Strategia.c - zawiera kod dla dyspozytora

MyFirstStrategy.c - zawiera Strategy.h i zapewnia jedną implementację strategii MyOtherStrategy.c - zawiera Strategy.h i zapewnia drugą implementację strategii

Pomysł polega na tym, że kod wstawiający wskaźniki funkcji i nazwy strategii do tabeli ekspedycji nie powinien żyć w Strategy.c, ale powinien znajdować się w plikach implementacji poszczególnych strategii, a tabela przeglądowa powinna być jakoś dynamicznie konstruowana w czasie kompilacji.

W przypadku tabeli dyspozycyjnej o stałym rozmiarze można zarządzać nią jak poniżej, ale chcę mieć tabelę o rozmiarach dynamicznych, nie chcę, aby implementacja Strategy.c zawierała wszystkie pliki nagłówkowe dla implementacji i chciałbym wysłać tabela do skonstruowania w czasie kompilacji, a nie w czasie wykonywania.

Stały rozmiar przykładu

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

To, czego naprawdę chcę, to magia preprocesora, którą mogę wstawić do plików implementacji strategii, aby obsłużyć to automatycznie, np.

MyFirstStrategy.c
#include "Strategy.h"

void firstStrategy( int param );

ADD_TO_DISPATCH_TABLE( "First Strategy", firstStrategy );

Jakieś pomysły ?

questionAnswers(3)

yourAnswerToTheQuestion