Во-первых, в C99, variadic function должен иметь по крайней мере один первый не VARIADIC аргумент (как printf
имеет const char*fmt
первый аргумент). См. stdarg(3)
Затем для удобства чтения я использовал бы typedef
для объявления сигнатуры функции, например.
typedef void drawfun_sigt (int, ...);
Объявите переменную, содержащую указатель на массив указателей:
drawfun_sigt** parr = NULL;
передать его (и обрабатывать отказ):
size_t nbfun = somenumber();
parr = malloc(nbfun*sizeof(drawfun_sigt*));
if (!parr) { perror("malloc"); exit(EXIT_FAILURE); };
Ясно, что (чтобы сделать поведение более воспроизводимым , Мне не нравятся неинициализированные элементы в массивах malloc
, но cmaster прокомментировал, что valgrind найдет эти ошибки); вы могли бы использовать calloc
вместо malloc
:
memset (parr, 0, nbfun*sizeof(drawfun_sigt*));
затем заполнить его соответствующим образом
extern void drawfunfoo(int, ....);
parr[0] = drawfunfoo;
Конечно, есть много способов, чтобы получить адрес функции. На POSIX систем (в частности, Linux) вы даже можете получить такой адрес динамически его имя с помощью dlopen(3) и dlsym(3)
Если указатели на функции имеют совершенно неизвестную подпись (т.е. если многоточие ...
означает что-то другое, чем VARIADIC функция в ваш вопрос), вы должны использовать libffi (или, если набор сигнатур известен, используйте указатели функций union
). Имейте в виду, что calling convention (и ABI) на вашей реализации C могут (и часто) диктуют разные способы вызова функций с другой подписью. Например, x86-64 ABI для Linux требует, чтобы переменные функции и невариантные функции вызывались по-разному и передавали некоторые формальные аргументы в регистры (разные регистры для integer и для плавающей запятой).
http://stackoverflow.com/questions/5488608/how-define-an-array-of-function-pointers-in-c – Ashalynd
Выполняют ли все функции одинаковые параметры? Указывает ли «...» на пропущенный код или буквально «...» означает, что они являются переменными? –
Вы лучше отредактируете свой вопрос, чтобы иметь реальный код C99 и избегать ваших '...' –