Как реализовать динамическую таблицу диспетчеризации на C

Прежде всего, я понимаю, как реализовать диспетчерскую таблицу, используя указатели на функции и строку или другой поиск, это не проблема.

Я ищу способ динамически добавлять записи в эту таблицу во время компиляции .

Тип структуры кода, на который я надеюсь, что-то вроде:

Strategy.h -содержит определение функции для диспетчера и определение таблицы диспетчеризации. Strategy.c -содержит код диспетчера

MyFirstStrategy.c -включает Strategy.h и предоставляет одну реализацию стратегии. MyOtherStrategy.c -включает Strategy.h и предоставляет вторую реализацию стратегии

. Идея состоит в том, что код для вставки указателей функций и имен стратегий в диспетчерскую таблицу не должен находиться в файле Strategy.c, а должен находиться в файлах реализации отдельных стратегий, а таблица поиска должна каким-то образом динамически создаваться во время компиляции.

Для таблицы отправки с фиксированным размером этим можно управлять, как показано ниже, но мне нужна таблица с динамическим размером, я не хочу, чтобы реализация Strategy.c включала все файлы заголовков для реализаций, и я бы хотел, чтобы отправка таблица должна быть построена во время компиляции, а не во время выполнения.

Пример фиксированного размера

Стратегия.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 );

Стратегия.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 );

Есть идеи ?

6
задан Brian Tompsett - 汤莱恩 17 April 2016 в 20:59
поделиться