Объявите указатель как указатель на функцию без прототипа (функция, принимающая неопределенное количество аргументов):
int (*func)();
Тогда ваша программа должна работать, без необходимости приведения (до тех пор, пока каждый вызов продолжает соответствовать функции, на которую указывает текущая функция).
#include <stdio.h>
int add(int a, int b);
int sub(int a, int b);
int Add3Num(int a, int b, int c);
int main(){
int (*func)(); /*unspecified number of arguments*/
int a = 20, b = 10, c = 5, result;
/*Casts not needed for these function pointer assignments
because: https://stackoverflow.com/questions/49847582/implicit-function-pointer-conversions */
func = add;
result = func(a, b);
printf("Result of 20 + 10 = %d\n", result);
func = sub;
result = func(a, b);
printf("Result of 20 - 10 = %d\n", result);
func = Add3Num;
result = func(a, b, c);
printf("Result of 20 + 10 + 5 = %d\n", result);
return 0;
}
/*...*/
В случае прототипированных функций соответствие между типами указателей на функции должно быть более или менее точным (с некоторыми оговоркамикак то, что квалификаторы верхнего уровня не имеют значения, или что вещи могут быть прописаны по-разному), или же стандарт оставляет вещи неопределенными.
В качестве альтернативы, и, возможно, предпочтительно, учитывая, что функции без прототипа и указатель на функцию являются устаревшей функцией,вы можете использовать строго типизированные указатели (сначала int (*)(int,int)
, а затем int (*)(int,int,int)
) и использовать приведение для навязывания вещей.
#include <stdio.h>
int add(int a, int b);
int sub(int a, int b);
int Add3Num(int a, int b, int c);
int main(){
int (*func)(int , int);
int a = 20, b = 10, c = 5, result;
func = add;
result = func(a, b);
printf("Result of 20 + 10 = %d\n", result);
func = sub;
result = func(a, b);
printf("Result of 20 - 10 = %d\n", result);
/*cast it so it can be stored in func*/
func = (int (*)(int,int))Add3Num;
/*cast func back so the call is defined (and compiles)*/
result = ((int (*)(int,int,int))func)(a, b, c);
printf("Result of 20 + 10 + 5 = %d\n", result);
return 0;
}
/*...*/