Раз уж в таблицу всё равно вносится номер - функции в таблице можно держать не по порядку, всё равно рядом с указателем на функцию лежит её код.
Лишние можно отсекать до того, как лезть в таблицу.
enum { start, back, left, right, count };
#define TBL_ENTRY(f) { f, do_##f }
typedef struct {
uint8_t prio;
void (*pfunc)(void);
} entry_t;
void do_start(void) { /* и так далее */ }
const entry_t table[count] PROGMEM = {
TBL_ENTRY(start),
TBL_ENTRY(left),
TBL_ENTRY(right),
TBL_ENTRY(back)
};
Ну а дальше проверить номер на превышение count и поиск по таблице.
Вариант 2:
Если функции в таблице размещать по порядку - тогда не нужно в таблице хранить номер. Но тогда компилятор должен поддерживать одну приятную вещь из C99 (и это работает только в С, не в С++)
enum { start, back, left, right, count };
#define TBL_ENTRY(f) [f] = do_##f
void do_start(void) {}
void do_back(void) {}
void do_left(void) {}
void do_right(void) {}
void (*functbl[count])() = {
TBL_ENTRY(right),
TBL_ENTRY(back),
TBL_ENTRY(start),
TBL_ENTRY(left)
};