移植程式代碼時,請考慮下列幾點:
下列假設已不再有效:
#ifdef _WIN32 // Win32 code ... #else // Win16 code ... #endif不過,64 位編譯程式會定義_WIN32以提供回溯相容性。
下列假設已不再有效:
#ifdef _WIN16 // Win16 code ... #else // Win32 code ... #endif在此情況下,else 子句可以代表_WIN32或_WIN64。
請小心數據類型對齊。 TYPE_ALIGNMENT 巨集會傳回數據類型的對齊需求。 例如:
TYPE_ALIGNMENT( KFLOATING_SAVE )== 4 on x86,Intel Itanium 處理器上的 8TYPE_ALIGNMENT( UCHAR )== 1例如,目前看起來像這樣的核心程序代碼:
ProbeForRead( UserBuffer, UserBufferLength, sizeof(ULONG) );應該會變更為:
ProbeForRead( UserBuffer, UserBufferLength, TYPE_ALIGNMENT(IOCTL_STRUC) );Intel Itanium 系統已停用核心模式對齊例外狀況的自動修正。
請小心 NOT 作業。 請考慮下列事項:
UINT_PTR a; ULONG b; a = a & ~(b - 1);問題是 ~(b–1) 會產生 “0x0000 0000 xxxx xxxx”,而不是 “0xFFFF FFFF xxxx xxxx”。 編譯程式不會偵測到此狀況。 若要修正此問題,請變更程序代碼,如下所示:
a = a & ~((UINT_PTR)b - 1);請小心執行未簽署和已簽署的作業。 請考慮下列事項:
LONG a; ULONG b; LONG c; a = -10; b = 2; c = a / b;結果意外很大。 規則是,如果任一作數不帶正負號,則結果為不帶正負號。 在上述範例中,會將 轉換成不帶正負號的值,除以 b,並將結果儲存在 c 中。 轉換不涉及數值作。
另一個例子是,請考慮下列事項:
ULONG x; LONG y; LONG *pVar1; LONG *pVar2; pVar2 = pVar1 + y * (x - 1);發生問題的原因是 x 為不帶正負號,這會使整個表達式不帶正負號。 除非 y 是負數,否則這可正常運作。 在此情況下,y 會轉換成不帶正負號的值,並使用32位有效位數、縮放和新增至 pVar1 來評估表達式。 32 位無符號負號數位會變成較大的 64 位正數,這會產生錯誤的結果。 若要修正此問題,請將 x 宣告為帶正負號的值,或明確地將 它類型轉換成表達式中的 LONG。
製作分次大小配置時請小心。 例如:
struct xx { DWORD NumberOfPointers; PVOID Pointers[100]; };下列程式代碼錯誤,因為編譯程式會以額外的 4 個字節填補 結構,讓 8 位元組對齊:
malloc(sizeof(DWORD) + 100*sizeof(PVOID));下列程式代碼正確:
malloc(offsetof(struct xx, Pointers) + 100*sizeof(PVOID));請勿將
(HANDLE)0xFFFFFFFF傳遞至 CreateFileMapping等函式。 請改用 INVALID_HANDLE_VALUE。列印字串時,請使用適當的格式規範。 使用 %p 以十六進位列印指標。 這是列印指標的最佳選擇。 Microsoft Visual C++支援列印多型數據的 %I。 Visual C++也支援 %I64 來列印 64 位的值。