>我有以下函数
static void p (){
}
我想将指向 p 的函数指针传递到函数 x 中。
void x(void * ptr){
}
我正在尝试以下内容,但它不起作用。
...
x(ptr);
注 x 和 p 属于不同的类。我收到以下编译错误。
invalid conversion from 'void (*)()' to 'void*' [-fpermissive]
它必须是:
void x(void(*function)())
{
// Whatever...
}
如果您使用的是 C++11,则可以使用 std::function:
void x(std::function<void()> function)
{
// Whatever
}
让我们看一下错误消息:
从
'void (*)()'
到'void*'
的转换无效 [-允许]
这意味着void*
(数据指针(是 x
,
中指定的类型但是void (*)()
(函数指针(正在传递。
所以x
改为
void x(void (*ptr)())
{
}
答案在错误消息中。 void*
不是指向函数的指针,void(*)()
(例如(是。您应该重写x
如下所示:
void x(void (*ptr)()) {
}
指向函数的指针是这样写的:
Ret (*name)(Params)
哪里
-
Ret
是脚尖的返回类型 -
name
是指针的名称 -
Params
是 pointee 参数的列表,就像您在其声明中编写它们一样。
例:
double (*ptr)(int, float)
。可以指向一个函数,该函数采用int
和float
并返回double
。
void*
不是函数指针,而是空指针。
若要声明函数指针,请使用 void (*ptr)()
。
我们可以做一些丑陋的指针魔法,像这样:
static void function1( char* c ) {
printf( "%s", c );
}
void function2( void* ptr ) {
void(* func)(char*) = (void(*)(char*))ptr;
func( "a" );
}
int _tmain(int argc, _TCHAR* argv[])
{
void* f = function1;
function2( f );
return 0;
}
这很糟糕,但在这种情况下有效。