3

http://msdn.microsoft.com/en-us/library/windows/desktop/aa384242%28v=vs.85%29.aspxからの引用

必要に応じて UINT_PTR と INT_PTR を使用してください (これらが必要かどうか不明な場合でも、念のため使用しても害はありません)。ポインターを ULONG、LONG、INT、UINT、または DWORD 型にキャストしないでください。

既存の 32 ビット コードラインで参照されている DWORD のすべてを UNIT_PTR に変換することは、副作用がなく安全であると安全に想定できますか?

コードライン全体で DWORD を参照している 32 ビット コードを移植するための推奨ガイドラインは他にありますか?

4

3 に答える 3

6

これは粗雑すぎる。コンパイラに作業を任せるだけで、警告 4302 を有効にして、ポインター値が切り捨てられたときに通知されるようにします。#pragma を適切な場所に配置します。プリコンパイル済みのヘッダー ファイルが理想的です。または/we4302コンパイラオプションを指定してください。

#pragma warning(default:4302)

int main()
{
    int* p = 0;
    long bad = (long)p;    // C4302: 'type cast' : truncation from int* to long
    return 0;
}

/Wp64 コンパイル オプションは、いずれにせよスニッフィングにも役立ちますが、問題があります

于 2013-02-26T19:50:02.937 に答える
2

INT_PTRまたはを使用する必要がUINT_PTRあるのは、変数にポインターを格納する予定がある場合のみです (さまざまな形式の を含むHANDLE)。通常の整数値であれば問題ありません。

DWORDすべてをやみくもにUINT_PTR. [つまり、32 ビット コードと同様に 64 ビット用にコードをコンパイルすると、型UINT_PTRは と同じにDWORDなるため、その場合は警告が表示されない可能性があります]。

于 2013-02-26T19:01:18.383 に答える
1

@MatsPeterssonの回答を追加するには-

アドレスを保持するために広く使用されている理由DWORDは、32 ビット アーキテクチャのポインター サイズと一致するためです。

ベスト プラクティスは、アドレスを保持する変数に専用の型を使用することです。それがUINT_PTR&のINT_PTR目的です - それらの定義はコンパイルターゲットに従って正しく設定されているため、32 ビットと 64 ビットの両方のターゲットに適しています。実際には、MS ヘッダーを参照して、これらの型が対応する実際のプリミティブ型を自分で確認できます。

変数がアドレス以外のデータに使用される場合は常に、格納されたデータに従って実際の型を定義する必要があり、通常は基盤となるコンピューター アーキテクチャに依存しDWORDませDWORDん。WORDWORD

于 2013-02-26T19:17:44.943 に答える