1. 程式人生 > >C++源程式遷移注意事項彙總【之一】

C++源程式遷移注意事項彙總【之一】

C++源程式遷移注意事項彙總:32位至64位,Windows平臺

本文記錄一下開發過程中遇到的遷移32位Windows源程式至64位Linux程式過程中的一些問題和處理經驗,希望對遇到類似問題的程式猿和程式媛有幫助。

整型資料的處理

問題

對於64位計算而言,因為Windows和Linux使用的是兩種不同的資料模型,即LLP64和LP64(有關資訊詳見64-bit computing)。因此,在用C++編寫的Windows程式中遇到需要將長整型轉換為指標型別的時候,編譯器會給出如下警告:

Warning C4312:“operation”: 從“type1”轉換到更大的“type2”;
此警告檢測將 32 位值分配給 64 位指標型別的嘗試,例如,將 32 位 int 或 long 強制轉換為 64 位指標。

原因即為LLP64模型中int和long整型均為32位,而 pointer 和 size_t 均為 64位,編譯器認為這可能是不安全的轉換,即使對於在發生符號擴充套件時適應 32 位的指標值也是如此。 如果為 64 位指標型別分配負 32 位整數,則符號擴充套件會導致指標值引用的記憶體地址與整數的值不同。

解決辦法

使用顯式定義的 int64_t 和 int32_t 資料型別,該型別在標頭檔案< cstdint.h > 中定義,並依據ISO C99規範進行定義,可以保證整型資料型別的定義獨立具體的平臺,確保跨平臺的相容性和一致性。

以下是一個實際的程式碼例子:

.....
typedef
int64_t CURSOR_TYPE; CURSOR_TYPE cursor_type = SQL_CURSOR_DYNAMIC; ret = SQLSetStmtAttr(this->m_hStmt, SQL_ATTR_CURSOR_TYPE, reinterpret_cast<SQLPOINTER>(cursor_type), SQL_IS_INTEGER); .....

《待續》