2011-07-28 24 views
38

可能性の重複:
When should static_cast, dynamic_cast and reinterpret_cast be used?static_castとreinterpret_castの違いは何ですか?

は、私はC言語でvoid型の引数として渡される構造が直接同じ構造タイプという保存されているC++でC関数を使用しています。

void foo::getdata(void *data){ 
    Testitem *ti = static_cast<Testitem*>(data); 
} 

と私はreinterpret_castを使用する場合、それは構造体に

を鋳造し、同じ仕事をしていません:C++私はstatic_castをを使用して同じことを行うにはC.

void getdata(void *data){ 
    Testitem *ti=data;//Testitem is of struct type. 
} 

例えば私が使用するときTestitem *it=(Testitem *)data;

これも同じことをします。 しかし、その3つを使ってどのように構造が影響を受けるのですか?

+0

そのスレッドはいつ使用するかについて述べています。私は、これらの3つのことを使用するときに、その構造とは何かが異なるのかと尋ねています。また、dynamic_castも忘れました。単純に、構造がどのように影響を受けているかを知りたいです。 – HariHaraSudhan

+0

構造体は影響を受けません(数値型間の変換を行わない限り)。 –

答えて

90

static_castは、(直感的に)いくつかの状況で成功する可能性があり、危険なキャストがなければ有意義なキャストであるキャストです。たとえば、あなたは、このような変換は意味があるので、void*が実際に、charint*、またはintを指す可能性があるため、int*void*static_castすることができます。ただしint*double*を指し示すように変換されている場合にのみ、この変換は意味をなさないので、static_castint*からdouble*にはできません。

reinterpret_castは、ある値のビットを別の値のビットとして再解釈する可能性のある安全でない変換を表すキャストです。たとえば、int*double*にキャストすると、結果は不明ですが、reinterpret_castで合法です。同様に、intvoid*にキャストするのは、完全にはreinterpret_castで合法ですが、安全ではありません。

static_castでもreinterpret_castも、何かからconstを削除できません。これらのキャストのいずれかを使用してint*const int*をキャストすることはできません。そのためには、const_castを使用します。

(T)という形式のCスタイルのキャストは、可能であればstatic_castを実行しようとしています。それが動作しない場合は、reinterpret_castに戻ってください。また、絶対に必要な場合は、const_castも適用されます。

通常、安全であるべきキャストについては、常にstatic_castを使用することをお勧めします。間違って定義されていないキャストをしようとすると、コンパイラはエラーを報告します。 reinterpret_castを実行するリスクがある場合は、マシン内のビットの解釈を実際に変更している場合にのみreinterpret_castを使用し、Cスタイルのキャストを使用してください。あなたのケースでは、void*からのダウンキャストは、場合によっては明確に定義されているため、static_castを使用する必要があります。

関連する問題