工具
本主題描述可用來讓應用程式準備好 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 位特定問題。
第一次執行編譯器時,可能會產生許多指標截斷或類型不相符的警告,例如:
warning C4311: 'type cast' : pointer truncation from 'unsigned char *' to 'unsigned long '
使用這些警告做為指南,讓程式碼更健全。 最好排除所有警告,特別是指標截斷警告。
請注意,此編譯器會啟用 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」,可能會遺失資料。
若要建置應用程式,請使用 Windows SDK 所提供的連結器和程式庫。 大部分的 32 位程式庫都有對應的 64 位版本,但某些舊版程式庫僅適用于 32 位版本。 針對 64 位 Windows 建置應用程式時,呼叫這些程式庫的程式碼將不會連結。