Но указатель функции указывает только на функцию с определенным типом и количеством аргументов.
Как создать универсальный указатель, который может указывать на любую функцию?
В ограниченном случае OP используйте void (*func)()
.
. Любой указатель функции может быть преобразован с помощью приведения типа к другому указателю функции и сохранить эквивалентный адрес функции. @ Джонатан Леффлер
int (*foo)(int) = (int (*)(int)) sqrt;
double (*sq)(double) = (double (*)(double)) foo;
printf("%f\n", sq(2)); // prints 1.414214
Указатель функции не должен обеспечивать сигнатуру параметра функции.
// No parameter info
// vv
int (*foo)() = (int (*)()) sqrt;
OP has "функции имеют разные параметры (все возвращают void) ", поэтому в коде OP можно использовать ограниченный указатель универсальной функции void (*func)()
и потерять проверку параметров.
typedef struct {
char *name; // suggest const char *name
void (*func)(); // no parameter info nor checking
} command_info;
char buf[100];
// void setbuf(FILE * restrict stream, char * restrict buf);
command_info fred = { "my_setbuf", setbuf };
// Both compile, 2nd is UB.
fred.func(stdin, buf); // No parameter checking.
fred.func(0); // No parameter checking.
При вызове .funf()
также возникает небольшая проблема: параметры ранжируются ниже * Передаются 1023 *, а также float
параметры перед передачей в функцию. Лучше всего убедиться, что параметры не char, float, short, _Bool
и c. чтобы избежать проблем с совместимой подписью.
void *
- это универсальный объект указатель. Может быть недостаточно кодировать указатель function . Так что это не переносимый кандидат. Нередко размер указателя функции больше sizeof(void*)
.