如何声明一个函数用作c中的函数指针?

时间:2011-11-11 13:11:36

标签: c

我对函数指针声明感到困惑。

我有一个api abc(),它接受​​一个参数:

void abc(void (*my_func)(void *p), int, int)

如果我想将我的函数作为参数传递给那个api,我在我的.h文件中声明它:

void (*xyz)(void *p)

并定义为:

void *(xyz)(void *p){
statements;
}

但这会引发错误。请指正。

6 个答案:

答案 0 :(得分:4)

你只需要声明它:

void xyz(void *p);

以相同的方式实施。

当您将其传递到api时,类型系统会自动将其计算出来:

abc(xyz,someint,anotherint);

答案 1 :(得分:3)

(*xyz)表示它是一个函数指针。

函数指针最好用typedef来处理。所以保证没有错。

我会做以下事情:

// define a type for the function (not its pointers, as you can often read)
typedef void my_func_t(void *p);

void abc(my_func_t*, int, int);

// declaration in order to be type-safe - impossible if only the pointer would be typedef'd
my_func_t my_func_impl; 

// definition:
void my_func_impl(void *p)
{
    do_something_with(p);
}

然后您可以使用abc()致电abc(my_func_impl, 47, 11)。您可以在&之前放置一个my_func_impl,以指出它是您希望获得的函数地址,但它是可选的。

另一种方法是写

typedef void (*my_func_p)(void *p);

并使用my_func_p代替my_func_t *,但这样做有一个缺点,就是你不能写my_func_t my_func_impl;

你为什么要这样做?

好吧,如果由于任何巧合或意外,函数定义更改了typedef,它们将不再匹配,但碰撞不会被声明为错误,而只会作为警告(不匹配指针)。 OTOH,my_func_t my_func_impl;作为一种原型,导致函数头不匹配,这是一个错误。

答案 2 :(得分:1)

如果我理解正确,您希望xyz成为传递给abc的函数,对吧?

正如参数my_func所示,您有一个指向函数的指针,该函数将void *作为参数并返回void

 type (*func_pointer)(type, type, type, .......)
   ^   ^       ^        ^     ^     ^
   |   |       |        |     |     |
   |   |       |        argument types
   |   |   pointer name
   | This is a function pointer
return type

因此,您需要将xyz声明为:

void xyz(void *p);

实施中也是如此:

void xyz(void *p){
    statements;
}

你做错了的是,你在.h文件中写的行定义了一个名为xyz的函数指针。函数指针没有值,因为你从未写过xyz = some_function;

您在源文件中编写的内容是一个函数,名称为xyz,其中void *为输入并返回void *,而不是void是你的意图。

也许这可以帮助你减少困惑:

当您撰写int *x;时,x是指向int的指针。然后,您可以int y;没有额外的*并撰写x = &y;

功能也一样。如果您有void (*funcptr)(void *p);,那么您需要的只是void some_func(void *p){}(再次没有额外的*)并写funcptr = some_func;的函数。您不需要&,因为函数名实际上是指向函数的指针。你可以说它更明确。

答案 3 :(得分:1)

简单地声明和定义您的功能,就像其他任何一样:

void xyz(void *p);

void xyz(void *p){
    // ...
}

并传递指向API的指针:

abc(xyz, 42, 7);

在适当的情况下,函数名称会自动解释为函数指针。你也可以明确地获取函数的地址,如果简洁不是你的事情:

abc(&xyz, 42, 7);

答案 4 :(得分:0)

'abc'的第一个参数是函数返回'void'并将'void *'作为参数的指针...

所以你的代码应该是这样的:

void
myFunc (void *) 
{
   // ... my statements
}

...

abc (myFunc, 10, 20);

答案 5 :(得分:0)

这有效

void abc(void* (*my_func)(void*), int a, int b) {
    my_func(0);
}

void *(xyz)(void *p) {}

int main() {
    abc(xyz, 0, 0);
    return 0;
}

当你写void (*my_func)(void *p)时,它表示指向函数的指针,返回void 而void (*my_func)(void *p)它表示指向函数的指针,它返回指针