1

Win32 APIの特定のチュートリアルでは、この行を使用して、lParam引数をWM_CREATEメインウィンドウプロシージャのメッセージから:に変換しますCREATESTRUCT*

reinterpret_cast<CREATESTRUCT*>(lParam)  // Method 1

私は他の場所でreinterpret_cast危険であり、未定義の動作、稲妻などをもたらすことを読みました。


コンパイラが文句を言わない、より一般的なキャストを使用しました。

(CREATESTRUCT*) lParam // Method 2

チュートリアルの作者が彼らのやり方でそれをした理由はありますか?

そして、私よりも良い方法があると確信していますか?

4

2 に答える 2

4

この特定のケースでは、両方の構成が同等です。未定義の動作はありません。C++標準では、ポインタを十分に広い整数に再解釈してキャストすると、同じポインタが返されることが保証されています。

lParamWindowsが、のように元のポインタから値を作成したと安全に想定できますreinterpret_cast

于 2012-10-31T09:00:37.520 に答える
1

「(CREATESTRUCT *)lParam」フォームはcスタイルキャストと呼ばれます。これを使用すると、コンパイラは式(lParam-ここ)を型(CREATESTRUCT *-ここ)に変換するために考えられるすべての方法を試します。

キャストのすべての可能な方法を説明させてください、

  1. 「const/volatileT」からTへのキャスト-C++では、プログラマーはconst_castを使用してこの方法を選択します
  2. TとRが関連する「T」から「R」へのキャスト。たとえば、int / char、Car /Vehicleなど-C++では、プログラマーはstatic_castを使用してこのキャスト方法を選択します。
  3. TとRが関連する「T」から「R」へのキャストとランタイムチェック。たとえば、T=VehicleおよびR=Carの場合、TタイプオブジェクトからRタイプオブジェクトへの変換は静的に有効ですが、実際には(実行時に)コンパイラは(非表示のコードを介して)タイプキャストされるオブジェクトが実際にCarであるか車の派生物。--C ++では、プログラマーはdynamic_castを使用してこのキャスト方法を選択します。
  4. 「U」から「V」へのキャスト。UとVは無関係です。--C ++では、プログラマーはreinterpret_castを使用してこのキャスト方法を選択します

プログラマーがC++でcスタイルのキャストを使用する場合、彼はコンパイラーに、式を特定の型に/特定の型として変換/認識するためのすべての可能な方法を試すように指示しています。

cスタイルのキャストが危険である唯一の理由は、プログラマーの本当の意図が、コードを読んでいるコンパイラーや他のプログラマーに適切に伝えられていないためです。プログラマーがstatic_castのみを意味し、reinterpret_castを意味しない場合もありますが、cスタイルのキャストを使用すると、実行時にエラーが発生し、コンパイル時にキャッチされる可能性があります。プログラマーが無関係の型でstatic_castを使用すると、コンパイラエラーが発生するためです。

また、ユーザー定義のキャスト演算子は、一部の動作(特にstatic_cast)に少し影響を与えますが、基本的な動作は変更しません。

于 2012-10-31T09:50:32.640 に答える