3

私はいくつかのコードを読み、Windows SDKファイルにジャンプします:c:\program files\microsoft visual studio 8\vc\platformsdk\include\basetsd.h

typedef _W64 int INT_PTR, *PINT_PTR;
typedef _W64 unsigned int UINT_PTR, *PUINT_PTR;

typedef _W64 long LONG_PTR, *PLONG_PTR;
typedef _W64 unsigned long ULONG_PTR, *PULONG_PTR;

#define __int3264   __int32

グーグルで調べたところ、INT_PTR はポインターと同じサイズの 1 つの int を意味することがわかりました。しかし、LONG_PTR の意味は何ですか? ポインターと同じサイズの long 型の 1 つ。しかし、long と int ではサイズが異なりませんか?

4

1 に答える 1

1

これらのマクロは、Win32 コードを移植可能にするのに役立つため、32 ビット モードと 64 ビット モードの両方でビルドできます。場合によっては、変数に数値またはポインターが含まれる可能性があることも示します。

INT_PTRandの目的は、ポインタを保持するために実際に使用されているandLONG_PTRの宣言を置き換えることです(一般的には悪いことですが、私が遭遇した古いコードでは、そのようなフィールドをオーバーロードし、それらを使用して 0 や -1 などのセンチネル整数を含めるか、実ポインタ)。たとえば、Win32 コードでは、 、、およびはすべて 4 バイトです。Win64 コードでは、とはまだ 4 バイトですが、8 バイトです。aが C スタイルのキャストを使用して int に格納されている場合、暗黙のうちに切り捨てられます。intlongintlongchar *intlongchar *char *

INT_PTRand (およびその符号なしバリアント) は、 or 、またはポインターのLONG_PTRいずれかに適合することが保証されているため、そのような使用法を簡単に修正できるように、異なる名前が付けられています。がある場合は、に置き換えます。などに置き換える必要があります。そのようなものは、元のセマンティクスを保持しながら、いずれかのタイプ (int、long、ポインターなど) に十分なストレージを割り当てます。intlongintINT_PTRunsigned intUINT_PTRlongLONG_PTR

例:

int iptr = (int) pData;   // bad

になり得る

INT_PTR iptr = (INT_PTR) pData;     // better

これは、x86 と x64 の両方のコンパイルで機能します。

潜在的な切り捨てを避けるために、ポインターのキャストを変更する必要があることに注意してください。さいわい、そうしないと、Visual Studio 2015 によって警告が表示されます。

WindowsHANDLE型は現在ポインターとして定義されているため、同じことが当てはまります。ただし、64 ビット モードであっても、4 バイトに収まるようにハンドルを安全に切り詰めることができることに注意してください。これは、実際のポインターには当てはまりません。

于 2016-11-10T17:05:42.307 に答える