首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

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

一、程序升级后,在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

void* AsFunc(void* p)

{

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

}

调用:void (*myExtractedFunction)(void*) = &AsFunc;

或者:

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.

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OU4T18ogIgr8yP_bLJy0VamA0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券