ツール

このトピックでは、アプリケーションを 64 ビットで準備する際に使用できるツールについて説明します。 Windows 10は、x64 および ARM64 ベースのプロセッサの両方で使用できます。

インクルード ファイル

API 要素は、32 ビットと 64 ビットの Windows の間で実質的に同じです。 Windows ヘッダー ファイルは、32 ビットと 64 ビットの両方のコードで使用できるように変更されています。 新しい 64 ビット型とマクロは、Windows.h に含まれるヘッダー ファイルのセット内にある新しいヘッダー ファイル Basetsd.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-extends the int value, UIntToPtr zero-extends the unsigned int value, LongToPtr sign-extends the long value, and ULongToPtr zero-extends 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: 切り捨ての警告。 たとえば、"型キャスト": "int*_ptr64" から "int" へのポインターの切り捨て。
  • C4312: より大きなサイズの警告への変換。 たとえば、"type cast": サイズが大きい "int" から "int*_ptr64" への変換。
  • C4318: 長さ 0 を渡します。 たとえば、定数 0 を memset 関数の長さとして渡します。
  • C4319: Not 演算子。 たとえば、"~": "unsigned long" を大きなサイズの "unsigned _int64" に拡張するゼロ。
  • C4313: 変換型指定子と引数が競合する 関数の printf ファミリを呼び出します。 たとえば、書式指定文字列の "printf": "%p" は、"_int64" 型の引数 2 と競合します。もう 1 つの例は、printf("%x", pointer_value)の呼び出しです。これにより、上位 32 ビットが切り捨てられます。 正しい呼び出しは printf("%p", pointer_value) です。
  • C4244: 既存の警告 C4242 と同じです。 たとえば、"return": "_int64" から "unsigned int" への変換では、データが失われる可能性があります。

64 ビットリンカーとライブラリ

アプリケーションをビルドするには、Windows SDK によって提供されるリンカーとライブラリを使用します。 ほとんどの 32 ビット ライブラリには対応する 64 ビット バージョンがありますが、特定のレガシ ライブラリは 32 ビット バージョンでのみ使用できます。 アプリケーションが 64 ビット Windows 用にビルドされている場合、これらのライブラリを呼び出すコードはリンクされません。