我对函数指针声明感到困惑。
我有一个api abc()
,它接受一个参数:
void abc(void (*my_func)(void *p), int, int)
如果我想将我的函数作为参数传递给那个api,我在我的.h文件中声明它:
void (*xyz)(void *p)
并定义为:
void *(xyz)(void *p){
statements;
}
但这会引发错误。请指正。
答案 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)
它表示指向函数的指针,它返回指针