1. Определитесь с терминологией: массив указателей на метки или массив указателей на функции ?!
2. В случае массива с указателями на функции:
CODE
// количество обработчиков
#define N_FUNC 16
// тип функции-обработчика
typedef void(TypFunc)(void);
// прототипы обработчиков для массива
TypFunc f1;
TypFunc f2;
...
TypFunc f16;
// сам массив указателей
TypFunc * mas_func[N_FUNC] = {f1,f2,.....,f16};
unsigned int nfunc; // индекс функции-обработчика
void main (void)
{
...
// необходимым вам образом вычисляете nfunc
...
if(nfunc < N_FUNC)
mas_func[nfunc](); // вызов необходимого обработчика
...
}
TypFunc f1
{...}
...
TypFunc f16
{...}
Код ДОЛЖЕН работать на любом Си, в том числе и стандартном, т.к. здесь нет никагого противоречия со стандартом.
Проверял на нескольких разных компиляторах/платформах
3. Реализацию с метками описал maksimp. Хотя с
Цитата
На стандартном Си нельзя.
я все же не совсем согласен
4. На чем и как написаны эти низкоуровневые обработчики? На асме или на Си?
Если на Си или асме в виде отдельных функций, то "goto" использовать нельзя, т.к. будет использоваться пролог одной функции, а эпилог другой, и они скорее всего будут не симетричные.
Если обработчики - это куски кода, то проще использовать "switch-case". Некоторые компиляторы сами оптимизируют такой программый код под вызод функций (при этом создается секция .switch, хранящая переходы оператора).