首先,我主要是一名Java程序员,但我的任务是在C中做一些网络工作。我有一个带有以下签名的函数:
foo(int, void (*) (int, char *, int))
这是void (*)
让我循环。这应该调用另一个函数(静态)
bar(int, char *, int)
我现在正确地认为foo
想要一个指向bar
的指针,当时我需要的变量是什么?
致电
foo(1,myfunction(1,&anCharArray,10));
因一些错误而失败。
如果任何人有关于指针的好文章的任何链接也会有所帮助。
答案 0 :(得分:2)
foo(1,myfunction(1,&anCharArray,10))
因一些错误而失败。
尝试改为:
foo(1, myfunction)
foo
函数的第二个参数是函数指针,但是你传递了一个函数调用的返回值。
答案 1 :(得分:1)
void (*)(int, char *, int)
是一个匿名参数,类型为'指向返回void
并返回三个参数的函数的指针:int
,char *
和另一个{{ 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));
}
这些是等效的。我仍然更喜欢明确的"我通过指向函数的指针调用函数"符号,但这不是必要的,现代风格往往避免它。