'型別轉換': 基本上就只是在變數/函數前面加一對小括號, 中間填入要轉成什麼型別, 像這個樣子 "(型別)", 例如:
(unsigned char *)ptr
看不出哪一點難, 對吧
不過在實際運用上, 經常會有其他運算元的干擾, 使我們不容易看出式子的意義, 因此我自己寫了二個 macro, 使用上還算方便清楚.
- 第一個巨集是讀取用的, 也就是把 dstPtr 轉成 sourType 的指標, 並讀出內容來.
- 第二個巨集則是寫入用的, 也就是把 sour 存入 dstPtr 所指向的位址.
#define getcast(dstPtr, sourType) *((sourType*)(dstPtr))
#define cpycast(dstPtr, sourType, sour) {*((sourType*)(dstPtr)) = sour; }
這二個巨集中的第一個參數 dstPtr 是一個指標(什麼樣的指標無所謂), 第二個參數 sourType 則是希望把它轉成什麼 "型別" 的指標來存/取資料, 而 sour 則是來源資料.
要注意的是: 如果你的 sour 是指標而不是常數或者是變數, 而你希望轉換的不是指標本身而是指標所指向的變數, 那就要自行加上一個取值的動作 (*), 當然 sourType 要帶取值後的型別.
這二個巨集可以換另一種寫法
#define getcast(dptr, stype) ((stype*)(dptr))[0]
#define cpycast(dptr, stype, sour) {((stype*)(dptr))[0] = sour; }
這二種寫法功能上都一樣, 個人用到目前為止也都沒有出現過什麼問題.
相關文章
文章標籤
全站熱搜