時代に遅れないためのWin64用アプリケーション開発64ビットコンピューティング最前線(2/3 ページ)

» 2005年06月15日 00時00分 公開
[C MAGAZINE]

新しいデータ型とヘルパー関数

 精度固定の整数については変数の長さを明示的に示すための型が新しく追加されています(Table9)。

Table9 精度固定の整数
内容
DWORD32 32ビット符号なし整数
DWORD64 64ビット符号なし整数
INT32 32ビット符号あり整数
INT64 64ビット符号あり整数
LONG32 32ビット符号あり整数
LONG64 64ビット符号あり整数
UINT32 32ビット符号なしINT32
UINT64 64ビット符号なしINT64
ULONG32 符号なしLONG32
ULONG64 符号なしLONG64

 ポインタに関する型およびマクロについては、それぞれTable10、11のようになっています。

Table10 ポインタの精度
内容
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

Table11 ポインタに関するマクロ
内容
_WIN64 64ビットプラットホーム
_WIN32 32ビットプラットホーム(ただし下位互換維持のため
64ビットプラットホームでも宣言されている)
_WIN16 16ビットプラットホーム

 また、型変換をするためのヘルパー関数が用意されています(Fig.5)。このヘルパー関数は、Basetsd.hに定義されており、これらの関数を用いることで型変換を安全かつ確実に行うことができます。

Fig.5 型変換ヘルパー関数一覧
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ビットでの互換性を考慮したアプリケーションを作成する場合、通常はオンにしておいたほうがよいでしょう。

Table12 型変換によるコンパイラ警告
(/Wp64+コンパイラ警告レベル3)
エラー番号 警告の意味
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で返して値の精度を欠落させてしまった

Windows API

 64ビットWindows環境でも、大部分のWindows APIはWin32から変更なしで利用することができます。ただし、いくつかのAPIは拡張されたデータ型を使用するために引数の型が変更されました。

 また、64ビット引数を2つの引数に分割するなど、APIそのものが変更されたものもあります。そして、Windowとクラスに関するポリモーフィック(〜Ptr)なAPIも追加されています。

 これらの変更点について、詳しくはMSDN(MSDNの「64ビットWindows API(英語)」の項)を参照していただくとして、ざっとFig.6、7のAPIが変更になります。

Fig.6 Fig.6 変更されるAPIや構造体
Fig.7 Fig.7 ポリモーフィックAPIと使用例

Copyright(C) 2010 SOFTBANK Creative Inc. All Right Reserved.

注目のテーマ