w64 檢測64位可移植性問題

2021-09-07 06:17:56 字數 609 閱讀 4409

__w64是種標識,用來幫助coder發現32位程式移植到64位程式的問題。上文說,有三種型別的數值,int、long、pointer,這三類數值在32位系統裡是32bit,在64位系統裡是64bit。將32位程式移植到64位程式跟上面這些東西有什麼關聯呢?看下面的例子。

有乙個變數 i0 ,不論在32位系統下,還是64位系統下,都是32bit,另乙個變數 i1,在32位系統下是32bit,在64位系統下是64bit。

那麼,當在32位系統下寫程式時,i0 = i1 不會有問題,都是32bit;但是在同樣的**移植到64位下時,實際發生的是64bit數值賦給32bit數值,有可能丟失精度。

為了提醒coder注意這種錯誤,通過/wp64 開關來開啟__w64功能,就能在32位系統中引起警告。

__w64貌似已經被vc拋棄,親測過,目前v9仍可用。最後,這個東西,不怎麼有用……但是atl中用到了。理解這個東西有助於理解atl**。the end.

32位程式移植到64位需要考慮的問題

翻譯自 概述 從32位到64位,根本性的區別在於兩種資料型別發生了變化 long和pointer。在32位環境下,顧名思義,兩者長度都是32位,也就是4個位元組 而在64位環境下,都是8個位元組。所以,當你把pointer或者long型資料賦給int型時,會發生資料截斷 data truncatio...

linux 32位向64位的移植常見問題

1.資料截斷 由於long型別變數的運算 賦值 比較 移位等 產生。long定義在x86上為32bits,而在ia64上為64bits.容易在與int型變數運算時出現異常。處理方法 盡量避免不同型別變數間的運算,避免將長度較長的變數賦值到較短的變數中,統一變數長度可以解決這個問題。簡單的對於32位轉...

64位平台編譯常見問題彙總(個人移植問題僅供參考)

這個問題在資料 32位程式移植到64位平台前的準備工作 中有提及到。以下是文章中的內容 涉及隱式函式宣告,如果沒有對 中呼叫的每乙個函式提供乙個原型,編譯器就會做出假設。編譯器產生的類似警告資訊 implicit function declaration assuming extern return...