精度固定の整数については変数の長さを明示的に示すための型が新しく追加されています(Table9)。
| 型 | 内容 |
|---|---|
| DWORD32 | 32ビット符号なし整数 |
| DWORD64 | 64ビット符号なし整数 |
| INT32 | 32ビット符号あり整数 |
| INT64 | 64ビット符号あり整数 |
| LONG32 | 32ビット符号あり整数 |
| LONG64 | 64ビット符号あり整数 |
| UINT32 | 32ビット符号なしINT32 |
| UINT64 | 64ビット符号なしINT64 |
| ULONG32 | 符号なしLONG32 |
| ULONG64 | 符号なしLONG64 |
| Table9 精度固定の整数 | |
ポインタに関する型およびマクロについては、それぞれTable10、11のようになっています。
| 型 | 内容 |
|---|---|
| DWORD_PTR | 符号なしlong型ポインタ |
| HALF_PTR | 半分のサイズのポインタ |
| INT_PTR | 符号ありint型のポインタ |
| LONG_PTR | 符号ありlong型のポインタ |
| SIZE_T | ポインタが参照できる最大限の値の型 |
| SSIZE_T | 符号ありのSIZE_T |
| UHALF_PTR | 符号なしHALF_PTR |
| UINT_PTR | 符号なしINT_PTR |
| ULONG_PTR | 符号なしLONG_PTR |
| Table10 ポインタの精度 | |
| 型 | 内容 |
|---|---|
| _WIN64 | 64ビットプラットホーム |
| _WIN32 | 32ビットプラットホーム(ただし下位互換維持のため 64ビットプラットホームでも宣言されている) |
| _WIN16 | 16ビットプラットホーム |
| Table11 ポインタに関するマクロ | |
また、型変換をするためのヘルパー関数が用意されています(Fig.5)。このヘルパー関数は、Basetsd.hに定義されており、これらの関数を用いることで型変換を安全かつ確実に行うことができます。
unsigned long HandleToUlong( const void *h ) long HandleToLong( const void *h ) void *LongToHandle( const long h ) unsigned long PtrToUlong( const void *p ) unsigned int PtrToUint ( const void *p ) unsigned short PtrToUshort ( const void *p ) long PtrToLong( const void *p ) int PtrToInt ( const void *p ) short PtrToShort ( const void *p ) void * IntToPtr ( const int i ) void * UIntToPtr ( const unsigned int ui ) void * LongToPtr ( const long l ) void * ULongToPtr ( const unsigned long ul )
型変換による警告メッセージもいくつか追加されています(Table12)。これらの警告メッセージは/Wp64コンパイラオプションをつけた場合の警告です。このオプションをオフにすることで警告を消すことができますが、32ビットと64ビットでの互換性を考慮したアプリケーションを作成する場合、通常はオンにしておいたほうがよいでしょう。
| エラー番号 | 警告の意味 |
|---|---|
| C4305 | 型変換の警告。例えばreturn文でunsigned _int64とするところをlongにしてしまっている |
| C4311 | 型変換の警告。例えばタイプキャストでポインタをint *_ptr64からintにしてしまっている |
| C4312 | 大きいサイズへの型変換警告。例えばタイプキャストでintからint *_ptr64などの大きなサイズへ変換している |
| C4318 | 長さの指定を0にした場合の警告。例えばmemset関数で文字数(size_t)の指定が0になっている |
| C4319 | NOTオペレーション(〜)の警告。例えばunsigned _int64などの大きなサイズにunsigned longを0拡張している |
| C4313 | 文字列操作系の警告。 例えばprintfなどで64ビットポインタなどの型のデータを、printf (”%x”, pointer)といった形で表現しようとしている |
| C4244 | C4242と同じ。例えばreturn文で_int64で返すところをunsigned intで返して値の精度を欠落させてしまった |
| Table12 型変換によるコンパイラ警告(/Wp64+コンパイラ警告レベル3) | |
64ビットWindows環境でも、大部分のWindows APIはWin32から変更なしで利用することができます。ただし、いくつかのAPIは拡張されたデータ型を使用するために引数の型が変更されました。
また、64ビット引数を2つの引数に分割するなど、APIそのものが変更されたものもあります。そして、Windowとクラスに関するポリモーフィック(〜Ptr)なAPIも追加されています。
これらの変更点について、詳しくはMSDN(MSDNの「64ビットWindows API(英語)」の項)を参照していただくとして、ざっとFig.6、7のAPIが変更になります。
Copyright(C) 2010 SOFTBANK Creative Inc. All Right Reserved.