C语言中的函数指针数组,具有不同的返回类型和参数

时间:2016-05-17 12:30:59

标签: c function-pointers

我有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])());
  ^

1 个答案:

答案 0 :(得分:4)

您似乎希望add_ptrhello_ptrtwice_ptr成为函数指针 types (因为您要转换为它们)而不是变量:

typedef int(*add_ptr)(int,int);
typedef void(*hello_ptr)(void);
typedef int(*twice_ptr)(int);

或者,如果您要将add_ptrhello_ptrtwice_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};

此外,您的零参数函数sayHellomain在参数列表中缺少关键字void。他们应该是这样的:

void sayHello(void) { … }
int main(void) { … }