因為某種原因(threaded red black tree c++ warpper),需要比較兩個函式指標是否相等。但是,這麼貌似很簡單的需求卻得不到滿足。
下表,是在visual c++ 2008 中,同乙個函式通過不同途徑得到的指標
key_comp
0x0041158c _febird_trb_compare_less
febird::g_relocate_febird_trb_compare_less
0x101cb4a4 _febird_trb_compare_less
febird_trb_compare_less
0x1051af60 febird_trb_compare_less(const trb_vtab *, const void *, const void *)
函式 febird_trb_compare_less 在 febird.dll 動態庫中,並且匯出。
febird::g_relocate_febird_trb_compare_less 是在 febird.dll 中定義了乙個全域性函式指標變數,並初始化為 &febird_trb_compare_less 。
key_comp 是使用 febird.dll 並將 &febird_trb_compare_less 傳遞給febird.dll中的另乙個函式(假設函式名為foo)。以上三個不同的指標值就是在foo中檢視到的。
在網上搜尋了很多關於函式指標比較的東西,最終得出的結論是:跨越dll的函式指標比較是未定義的,除非是其中乙個是null指標。不光vc,很多其他編譯器也做不到跨dll的已定義的函式指標比較。
原本以為是dll重定位的問題,但是將函式指標放到 febird::g_relocate_febird_trb_compare_less 中也無濟於事,反而更多出了乙個指標值(0x101cb4a4 )。
最終我的問題也解決了,就是在把這個比較放在標頭檔案中,並且,key_comp作為乙個模板引數來直接和&febird_trb_compare_less比較。
另外,函式指標作為模板引數時,不能將null之類的東西作為該模板引數傳遞。因為這個時候模板引數必須是乙個const extern變數。如果試圖傳遞null,在不同的編譯器下會得到不同的錯誤資訊(這樣做在gcc4.1下編譯過了,但連線錯誤)。
指標 陣列 函式之間的聯絡
指標陣列 定義 int p n 1.優先順序高,先與p結合成為乙個陣列,2.再由int 說明這是乙個整型指標陣列,3.它有n個指標型別的陣列元素。陣列指標 定義 int p n 1.優先順序高,首先說明p是乙個指標,2.指向乙個整型的一維陣列,3.執行p 1時,p要跨過n個整型資料的長度 總結 陣列...
成員函式指標 (結構 與普通函式指標之間的轉換)
通過記憶體拷貝 memcpy等 可以實現任意指標 間的強制轉換,但不能保證可以正常使用。通過網上查詢發現 函式成員指標其實與普通成員指標不同,它除了包含函式本身位址以外還包含其他資訊 例如是否為虛函式等 所以不能簡單的理解成員函式指標就是普通指標那樣一般佔4位元組,這個視編譯器不同而不同 例如在vs...
指標與陣列,指標與函式之間的關係
指標陣列,它的關鍵在於是乙個陣列,即陣列中每個元素都是指標。陣列指標,他的關鍵在於是指標變數,即這個指標指向乙個陣列。include int main 這是乙個陣列,大家都知道。int parr1 4 這是指標陣列,首先的優先順序比 的優先順序高,所以parr 先與結合,它是乙個陣列,然後再與 結合...