これらのマクロは、Win32 コードを移植可能にするのに役立つため、32 ビット モードと 64 ビット モードの両方でビルドできます。場合によっては、変数に数値またはポインターが含まれる可能性があることも示します。
INT_PTR
andの目的は、ポインタを保持するために実際に使用されているandLONG_PTR
の宣言を置き換えることです(一般的には悪いことですが、私が遭遇した古いコードでは、そのようなフィールドをオーバーロードし、それらを使用して 0 や -1 などのセンチネル整数を含めるか、実ポインタ)。たとえば、Win32 コードでは、 、、およびはすべて 4 バイトです。Win64 コードでは、とはまだ 4 バイトですが、8 バイトです。aが C スタイルのキャストを使用して int に格納されている場合、暗黙のうちに切り捨てられます。int
long
int
long
char *
int
long
char *
char *
INT_PTR
and (およびその符号なしバリアント) は、 or 、またはポインターのLONG_PTR
いずれかに適合することが保証されているため、そのような使用法を簡単に修正できるように、異なる名前が付けられています。がある場合は、に置き換えます。などに置き換える必要があります。そのようなものは、元のセマンティクスを保持しながら、いずれかのタイプ (int、long、ポインターなど) に十分なストレージを割り当てます。int
long
int
INT_PTR
unsigned int
UINT_PTR
long
LONG_PTR
例:
int iptr = (int) pData; // bad
になり得る
INT_PTR iptr = (INT_PTR) pData; // better
これは、x86 と x64 の両方のコンパイルで機能します。
潜在的な切り捨てを避けるために、ポインターのキャストを変更する必要があることに注意してください。さいわい、そうしないと、Visual Studio 2015 によって警告が表示されます。
WindowsHANDLE
型は現在ポインターとして定義されているため、同じことが当てはまります。ただし、64 ビット モードであっても、4 バイトに収まるようにハンドルを安全に切り詰めることができることに注意してください。これは、実際のポインターには当てはまりません。