美文网首页历史解谜圣经故事养生健康
成员函数指针做回调参数总结 踩坑

成员函数指针做回调参数总结 踩坑

作者: 水晓朴 | 来源:发表于2023-12-14 08:00 被阅读0次

成员函数指针做回调参数总结 踩坑

一、程序升级后,在linux上编译提示错误:

warning: converting from ‘int (MyClass::*)()’ to ‘void(*)()’ [-Wpmf-conversions]

void(*myStoredFunction)(void) = (GENERIC_FUNC_TYPE)memberFunc; //Compiler warning

二、出现这个情况是因为,程序的这个模块是早期开发的,使用的是gcc4开发的,现在升级到gcc7,c++版本兼容性问题,具体解决方法如下:

1:用内联汇编方式,跳过c++,语法检测,x86_64汇编代码如下:

__asm__ (

"mov %1, %0"

:"=r"(addr)

:"r"(&TEST::foo)

);

或者这样更好:

__asm__ ( "" // no instructions

:"=r"(addr)

:"0"(&TEST::foo) // same

register as operand 0

);

2:c++语法转换方式,代码如下:

template <typename C, void (C::*M)()>

void* AsFunc(void* p)

{

(static_cast<C*>(p)->*M)();

}

调用:void (*myExtractedFunction)(void*) = &AsFunc<MyClass, &MyClass::myMemberFunc>;

或者:template

dst_type pointer_cast(src_type src)

{

return*static_cast(static_cast(&src));

}

三、区别总结

参考相关文献

成员函数指针

C++函数指针、函数对象与C++11 function对象对比分析

C++强制类型转换操作符static_cast

C++动态联编实现原理分析

C++类成员函数调用分析

Pointers

to Member Functions

a pointer to member function to

be invoked by the target class without functional

Declares a variable of

a pointer or pointer-to-member type.

相关文章

  • 函数指针算法库

    函数指针, 函数指针数组声明 通过参数指定回调函数,代码示例 算法库代码说明 argc:参数个数 argv:回调函...

  • 回调函数

    回调函数:函数当做一个参数来使用的时候,这个函数叫做回调函数。 回调函数语法: 解释: callback: 这个是...

  • Node.js-回调函数

    回调函数 回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被...

  • JS 回调函数浅析

    回调函数:回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被...

  • 回调与闭包

    1、回调函数 一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调...

  • 王道程序员求职宝典(十)函数,栈与队列

    函数 参数传递值传递指针传递引用传递指针引用*& 内联函数成员函数内联普通函数内联宏定义 默认参数从右向左设定默认...

  • 异步的解决方案

    回调 回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来...

  • C++——指向类成员(数据函数)的指针

    一、指向类数据成员的指针 二、指向类成员函数的指针 三、总结

  • 回调函数

    回调函数说白了就是函数作为参数,如:a函数作为b函数的一个参数,那么b函数执行时调用a函数的指针,指针指向a函数,...

  • 智能指针std::shared_ptr初始化时可能泄露的地方

    如果一个函数的参数需要一个智能指针,而我们在调用该函数时才生成该指针,而其他参数也有函数调用,如果其他参数的函数调...

网友评论

    本文标题:成员函数指针做回调参数总结 踩坑

    本文链接:https://www.haomeiwen.com/subject/pxeigdtx.html