3

次の質問に対する回答は、C++でのstatic_castdynamic_cast、およびの推奨される使用法を示しています。reinterpret_cast

static_cast、dynamic_cast、const_cast、および reinterpret_cast はいつ使用する必要がありますか?

この種のキャストの誤用を検出するために使用できるツールを知っていますか? PC-Lint や Coverity Static Analysis などの静的解析ツールはこれを行いますか?

この質問を促した特定のケースはstatic_cast、ポインターをダウンキャストするための不適切な使用であり、コンパイラーは警告しません。ツールを使用してこのケースを検出したいと思います。開発者がこの間違いを決して犯さないとは思いません。

4

3 に答える 3

5

コンパイル時にポインターが指す型を確実に伝える方法がないことを考えると、これはコンパイル時にキャッチするのが非常に難しい問題です。

最も簡単な方法は、実行時にキャッチを実行することです。マクロ「safe_cast」を使用して、デバッグで assert を使用して dynamic_cast にコンパイルし、リリースで static_cast を使用します。

現在、デバッグ中にキャストが不適切な場合、動的キャストは NULL を返し、アサートします。リリース時のオーバーヘッドもありません。

于 2010-03-18T00:46:12.320 に答える
4

Visual Studio には、これらのいくつかに対する警告があります。たとえば、C4946。ただし、デフォルトではほとんどオフになっています。

http://msdn.microsoft.com/en-us/library/23k5d385.aspx

于 2010-03-18T06:50:37.473 に答える
0

Boost は polymorphic_pointer_downcast() および polymorphic_downcast() 関数を提供します。これらは static_cast のように動作しますが、同等の dynamic_cast が失敗した場合に (通常はデバッグ ビルドでのみ) アサートします。

詳細については、 http://www.boost.org/doc/libs/1_61_0/libs/conversion/cast.htmを参照してください。

于 2016-08-10T20:07:43.387 に答える