可能性のある複製:
static_cast、dynamic_cast、reinterpret_castはいつ使用する必要がありますか?
C++でc関数を使用しています。cでvoid型の引数として渡された構造体は、同じ構造体型に直接格納されます。
例:C.
_void getdata(void *data){
Testitem *ti=data;//Testitem is of struct type.
}
_
c ++で同じことを行うには、static_castを使用します:
_void foo::getdata(void *data){
Testitem *ti = static_cast<Testitem*>(data);
}
_
そして、私が_reinterpret_cast
_を使用すると、同じ仕事をし、構造体をキャストします
Testitem *it=(Testitem *)data;
を使用するとき
これも同じことを行います。しかし、これらの3つを使用すると、構造はどのように影響を受けますか。
static_cast
は、あるタイプから別のタイプへのキャストであり、(直感的に)ある状況下で成功し、危険なキャストがない場合に意味のあるキャストです。たとえば、static_cast
が実際にvoid*
またはint
を指す場合があるため、int*
a void*
をint*
にできます。このような変換は意味があるため、char
に。ただし、static_cast
とint*
をdouble*
に変換することはできません。この変換は、int*
が何らかの形でdouble*
を指すようにマングルされている場合にのみ意味があります。
reinterpret_cast
は、ある値のビットを別の値のビットとして再解釈する可能性がある安全でない変換を表すキャストです。たとえば、int*
をdouble*
にキャストすることはreinterpret_cast
で有効ですが、結果は指定されていません。同様に、int
をvoid*
にキャストすることはreinterpret_cast
と完全に合法ですが、安全ではありません。
static_cast
もreinterpret_cast
も、何かからconst
を削除できません。これらのキャストを使用して、const int*
をint*
にキャストすることはできません。これには、const_cast
を使用します。
(T)
形式のCスタイルキャストは、可能であればstatic_cast
を実行しようとして定義され、それが機能しない場合はreinterpret_cast
にフォールバックします。絶対に必要な場合は、const_cast
も適用されます。
一般に、安全なキャストには常にstatic_cast
を好む必要があります。誤って明確に定義されていないキャストを実行しようとすると、コンパイラーはエラーを報告します。マシンの一部のビットの解釈を実際に変更している場合にのみreinterpret_cast
を使用し、reinterpret_cast
を実行するリスクがある場合にのみCスタイルのキャストを使用してください。場合によっては、static_cast
からのダウンキャストが状況によって明確に定義されるため、void*
を使用する必要があります。