将void值函数作为C中函数签名的一部分传递

时间:2014-09-21 22:10:21

标签: c pointers function-pointers void-pointers

首先,我主要是一名Java程序员,但我的任务是在C中做一些网络工作。我有一个带有以下签名的函数:

foo(int, void (*) (int, char *, int))

这是void (*)让我循环。这应该调用另一个函数(静态)

bar(int, char *, int)

我现在正确地认为foo想要一个指向bar的指针,当时我需要的变量是什么? 致电

foo(1,myfunction(1,&anCharArray,10));

因一些错误而失败。

如果任何人有关于指针的好文章的任何链接也会有所帮助。

2 个答案:

答案 0 :(得分:2)

foo(1,myfunction(1,&anCharArray,10)) 
     

因一些错误而失败。

尝试改为:

foo(1, myfunction) 

foo函数的第二个参数是函数指针,但是你传递了一个函数调用的返回值。

答案 1 :(得分:1)

void (*)(int, char *, int)是一个匿名参数,类型为'指向返回void并返回三个参数的函数的指针:intchar *和另一个{{ 1}}&#39 ;.您需要将此类函数的名称(在您的情况下为int)作为函数bar的第二个参数传递。就个人而言,我更倾向于看到foo的声明用返回类型和参数名称编写,foo的声明也应该有参数的返回类型和名称。名称不必在函数声明和定义之间匹配,但通常不会将它们视为改变它们之间名称的好方式。

bar()

然后你可以打电话:

void foo(int num, void (*func)(int num, char *str, int len));
static void bar(int num, char *str, int len);

foo(10, bar); 内,您将拥有以下代码:

foo()

或者,如果你是新学校(不是像我这样古老的遗物),那么:

void foo(int num, void (*func)(int num, char *str, int len))
{
    char str[] = "Supercalifragilisticexpialidocious";
    (*func)(num, str, strlen(str));
}

这些是等效的。我仍然更喜欢明确的"我通过指向函数的指针调用函数"符号,但这不是必要的,现代风格往往避免它。