共用方式為


其他考慮

移植程式代碼時,請考慮下列幾點:

  • 下列假設已不再有效:

    #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 位的值。