關於(void**)及其相關的理解


#define LOADBASSFUNCTION (f) *((void **)&f)=(void*)GetProcAddress (hBass,# f)
這一句話使用*((void**)&f)的原因在於,轉化目標為左值(即轉化f為void*類型(*)的函數指針)。
注意這里的(void**)強制類型轉換僅僅只是重新聲明了指針解引用的方式,並沒有提升指針的引用層級。意思上*((void**)&f)與f是相等的(忽略(void**)只看*&f就知道這本質上就是先取地址再解引用)。但是不能直接使用f,因為一個函數名不能做左值(要做左值必須指針化,也就是變成函數指針)。如果需要一個函數名直接做左值的話,需要將其轉換為指針再取內容。實際上(void**)可以被看成(void*  *),后面的*表示函數被取地址后是一個指針,前面的void*表示這個指針被從新解釋成了指向void*類型的指針(也就是相當於函數名被轉換成了一個指針),之后對這個地址(&f)解引用,得到的自然就已經是一個函數指針了。
在hge中有這樣一行代碼:
#define LOADBASSFUNCTION(f) *((void**)&f)=(void*)GetProcAddress(hBass,#f)
這是一個宏,作用是將任意函數指針f,都賦值成來自動態鏈接庫的同名函數。右邊使用的是(void*)指針做強制類型轉換,這是一個通用的方法,不用擔心具體函數簽名是什么。
另外,只能使用函數指針來接收一個函數地址,無論是從動態庫導出的函數。還是其他的函數。
 

注釋:
(*)在c++中void*可以接收所有類型的指針,但是反之不可。在c中void*既可以賦值給任何指針,也可以被任何指針賦值。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM