我有3个具有不同返回类型和不同参数的函数。我试图创建一个函数指针数组,然后调用它们。但它不起作用。请提供一些建议。
#include <stdio.h>
/* Array of function pointers (different return types and parameters) */
void sayHello()
{
printf("Hello World\n");
}
int add(int a, int b)
{
return a+b;
}
int twice(int a)
{
return 2*a;
}
int main()
{
int choice;
int(*add_ptr)(int,int) = NULL;
void(*hello_ptr)(void) = NULL;
int(*twice_ptr)(int) = NULL;
void * func_table[] = {(void *)sayHello, (void *)add, (void *)twice};
printf("Add : %d\n", ((add_ptr)func_table[1])(10,5));
printf("Hello : \n",((hello_ptr)func_table[0])());
printf("Twice : %d\n",((twice_ptr)func_table[2])(10));
return 0;
}
修改
我已将代码编辑为:
#include <stdio.h>
/* Array of function pointers (different return types and parameters) */
void sayHello()
{
printf("Hello World\n");
}
int add(int a, int b)
{
return a+b;
}
int twice(int a)
{
return 2*a;
}
int main()
{
int choice;
typedef int(*add_ptr)(int,int);
typedef void(*hello_ptr)(void);
typedef int(*twice_ptr)(int);
void * func_table[] = {(void *)sayHello, (void *)add, (void *)twice};
printf("Add : %d\n", ((add_ptr)func_table[1])(10,5));
printf("Hello : ",((hello_ptr)func_table[0])());
printf("Twice : %d\n",((twice_ptr)func_table[2])(10));
return 0;
}
但我仍然收到错误:
error: invalid use of void expression
printf("Hello : ",((hello_ptr)func_table[0])());
^
答案 0 :(得分:4)
您似乎希望add_ptr
,hello_ptr
和twice_ptr
成为函数指针 types (因为您要转换为它们)而不是变量:
typedef int(*add_ptr)(int,int);
typedef void(*hello_ptr)(void);
typedef int(*twice_ptr)(int);
或者,如果您要将add_ptr
,hello_ptr
和twice_ptr
作为变量并将func_table
的元素分配给这些变量,那么:
add_ptr = func_table[1];
hello_ptr = func_table[0];
twice_ptr = func_table[2];
printf("Add : %d\n", add_ptr(10,5));
printf("Hello : "); hello_ptr();
printf("Twice : %d\n", twice_ptr(10));
此外,您无需在此处转换为void*
:
void * func_table[] = {sayHello, add, twice};
此外,您的零参数函数sayHello
和main
在参数列表中缺少关键字void
。他们应该是这样的:
void sayHello(void) { … }
int main(void) { … }