工具

本主題描述可用來讓應用程式準備好 64 位的工具。 Windows 10適用于 x64 和 ARM64 型處理器。

包含檔案

API 元素在 32 位和 64 位 Windows 之間幾乎完全相同。 Windows 標頭檔已經過修改,以便可用於 32 位和 64 位程式碼。 新的 64 位類型和巨集定義于新的標頭檔 Basetsd.h 中,該檔案位於 Windows.h 所包含的標頭檔集中。 Basetsd.h 包含新的資料類型定義,可協助讓原始程式碼文字大小獨立。

新資料類型

Windows 標頭檔包含新的資料類型。 這些類型主要是為了與 32 位資料類型的型別相容性。 新類型提供與現有類型完全相同的類型,同時提供 64 位 Windows 的支援。 如需詳細資訊,請參閱 新的資料類型 或 Basetsd.h 標頭檔。

預先定義的巨集

編譯器會定義下列宏來識別平臺。

巨集 意義
_WIN64 64 位平臺。 這包括 x64 和 ARM64。
_WIN32 32 位平臺。 此值也會由 64 位編譯器定義,以取得回溯相容性。
_WIN16 16 位平臺

下列宏是架構特有的。

巨集 意義
_M_IA64 Intel Itanium 平臺
_M_IX86 x86 平臺
_M_X64 x64 平臺
_M_ARM64 ARM64 平臺

請勿使用這些宏,但架構特定的程式碼除外,請盡可能使用_WIN64、_WIN32和_WIN16。

輔助函式

下列內嵌函式 (在 Basetsd.h) 中定義,可協助您安全地將值從某個類型轉換成另一種類型。

void            * Handle64ToHandle( const void * POINTER_64 h ) 
void * POINTER_64 HandleToHandle64( const void *h )
long              HandleToLong(     const void *h )
unsigned long     HandleToUlong(    const void *h )
void            * IntToPtr(         const int i )
void            * LongToHandle(     const long h )
void            * LongToPtr(        const long l )
void            * Ptr64ToPtr(       const void * POINTER_64 p )
int               PtrToInt(         const void *p )
long              PtrToLong(        const void *p )
void * POINTER_64 PtrToPtr64(       const void *p )
short             PtrToShort(       const void *p )
unsigned int      PtrToUint(        const void *p )
unsigned long     PtrToUlong(       const void *p )
unsigned short    PtrToUshort(      const void *p )
void            * UIntToPtr(        const unsigned int ui )
void            * ULongToPtr(       const unsigned long ul )

警告

IntToPtr sign-extend the int value, UIntToPtr zero-extend the unsigned int value, LongToPtr sign-extend the long value, and ULongToPtr zero-extend the unsigned long value.

64 位編譯器

64 位編譯器可用來識別指標截斷、不正確的類型轉換和其他 64 位特定問題。

第一次執行編譯器時,可能會產生許多指標截斷或類型不相符的警告,例如:

warning C4311: 'type cast' : pointer truncation from 'unsigned char *' to 'unsigned long '

使用這些警告做為指南,讓程式碼更健全。 最好排除所有警告,特別是指標截斷警告。

64 位編譯器參數和警告

請注意,此編譯器會啟用 LLP64 資料模型。

有一個警告選項可協助移植到 LLP64。 -Wp64 -W3 參數會啟用下列警告:

  • C4305:截斷警告。 例如,「return」:從 「unsigned int64」 截斷為 「long」。
  • C4311:截斷警告。 例如,「type cast」:指標截斷從 「int*_ptr64」 到 「int」。
  • C4312:轉換成較大的大小警告。 例如,「type cast」:從 「int」 轉換為大於大小的 「int*_ptr64」。
  • C4318:傳遞零長度。 例如,將常數零當做長度傳遞至 memset 函式。
  • C4319:Not 運算子。 例如,「~」:零會將 「unsigned long」 擴充為大於大小的 「unsigned _int64」。
  • C4313:呼叫具有衝突轉換類型規範和引數之函式的 printf 系列。 例如,格式字串中的 「%p」 與類型為 「_int64」 的引數 2 衝突。另一個範例是呼叫 printf (「%x」,pointer_value) ;這會導致截斷上限 32 位。 正確的呼叫是 printf (「%p」,pointer_value) 。
  • C4244:與現有的警告 C4242 相同。 例如,「return」:從 「_int64」 轉換為 「unsigned int」,可能會遺失資料。

64 位連結器和程式庫

若要建置應用程式,請使用 Windows SDK 所提供的連結器和程式庫。 大部分的 32 位程式庫都有對應的 64 位版本,但某些舊版程式庫僅適用于 32 位版本。 針對 64 位 Windows 建置應用程式時,呼叫這些程式庫的程式碼將不會連結。