博客 / 詳情

返回

成員函數指針做回調參數總結 踩坑

成員函數指針做回調參數總結 踩坑
一、程序升級後,在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<typename dst_type,typename src_type>
dst_type pointer_cast(src_type src)
{
return static_cast<dst_type>(static_cast<void*>(&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.
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.