继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

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

星华梦
关注TA
已关注
手记 1
粉丝 0
获赞 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));

}






打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP