C++源程式遷移注意事項彙總【之一】
阿新 • • 發佈:2019-02-20
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);
.....
《待續》