C++传递函数指针
C++ passing function pointer
我有以下功能
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(*)()
(例如)是。您应该按如下方式重写 x
:
void x(void (*ptr)()) {
}
函数指针是这样写的:
Ret (*name)(Params)
在哪里
Ret
是指针对象的 return 类型
name
是指针的名字
Params
是指针对象的参数列表,正如您在其声明中所写的那样。
示例:
double (*ptr)(int, float)
...可以指向一个接受 int
和 float
和 returning double
.
的函数
我们来看看报错信息:
invalid conversion from 'void (*)()'
to 'void*'
[-fpermissive]
表示void*
(一个数据指针)是x
,
中指定的类型
但是 void (*)()
(函数指针)被传递了。
所以把x
改成
void x(void (*ptr)())
{
}
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;
}
这很糟糕,但在这种情况下有效。
我有以下功能
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(*)()
(例如)是。您应该按如下方式重写 x
:
void x(void (*ptr)()) {
}
函数指针是这样写的:
Ret (*name)(Params)
在哪里
Ret
是指针对象的 return 类型name
是指针的名字Params
是指针对象的参数列表,正如您在其声明中所写的那样。
示例:
double (*ptr)(int, float)
...可以指向一个接受 int
和 float
和 returning double
.
我们来看看报错信息:
invalid conversion from
'void (*)()'
to'void*'
[-fpermissive]
表示void*
(一个数据指针)是x
,
中指定的类型
但是 void (*)()
(函数指针)被传递了。
所以把x
改成
void x(void (*ptr)())
{
}
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;
}
这很糟糕,但在这种情况下有效。