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

關於(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*既可以賦值給任何指針,也可以被任何指針賦值。
轉載地址:http://www.cnblogs.com/wubugui/p/4247733.html
發佈了31 篇原創文章 · 獲贊 17 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章