問題タブ [reinterpret-cast]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - void* をキャストするときに static_cast または reinterpret_cast を使用する必要があります
との両方がstatic_cast
、別のポインター型へのreinterpret_cast
キャストに対して正常に機能するようです。void*
どちらか一方を優先する正当な理由はありますか?
c++ - reinterpret_cast はいつ使用するのですか?
reinterpret_cast
vsの適用可能性について少し混乱していstatic_cast
ます。私が読んだことから、一般的なルールは、コンパイル時に型を解釈できる場合は静的キャストを使用することstatic
です。これは、C++ コンパイラが暗黙のキャストにも内部的に使用するキャストです。
reinterpret_cast
は、次の 2 つのシナリオに適用できます。
- 整数型をポインタ型に、またはその逆に変換する
- あるポインター型を別の型に変換します。私が得る一般的な考えは、これは移植性がなく、避けるべきだということです。
私が少し混乱しているのは、私が必要とする 1 つの使用法です。C から C++ を呼び出しており、C コードは C++ オブジェクトを保持する必要があるため、基本的にvoid*
. void *
とClass 型の間の変換に使用するキャストはどれですか?
static_cast
とreinterpret_cast
?の両方の使用法を見てきました。私が読んでいたことからstatic
、コンパイル時にキャストが発生する可能性があるため、より良いように見えますか? reinterpret_cast
あるポインター型から別のポインター型に変換するために使用すると言われていますが?
c++ - メンバー関数ポインターを再解釈することは「良い考え」ですか?
「スレッド アクション」のリストを保持するワーカー スレッドがあり、それらを when として処理します。
通常はこのように呼びます
それまではうまくいきました
に変更されました
残念ながら、他のものには新しい形式が必要なので、再度変更することはできません (また、オーバーロードは戻り値の型だけで異なるわけではありません)。
私は試しました
これはうまく機能しているように見えますが、このような関数ポインターの再解釈が「定義済み」の動作であるかどうかはわかりません。誰かアドバイスしてもらえますか?
c++ - C ++:整数をポインターにキャストする安全な方法
アドレスを含む整数型を実際のポインタ型に変換する必要があります。次のようにreinterpret_castを使用できます。
ただし、これは、問題のアドレスが実際にMyClassオブジェクトを保持しているかどうかを確認するための実行時チェックを実行しません。最初にvoid*に変換し(reinterpret_castを使用)、次に結果にdynamic_castを使用することに利点があるかどうかを知りたいです。このような:
2番目の方法を使用することに利点はありますか?
c++ - reinterpret_cast を使用する代わりに void* を介してキャストする
私は本を読んでreinterpret_cast
いますが、直接使用するべきではなく、 void* と組み合わせてキャストする必要があることがわかりましたstatic_cast
:
それ以外の:
ただし、これが直接キャストよりも優れている理由の説明が見つかりません。誰かが私に説明をしてくれたり、答えを教えてくれたりすると、とても感謝しています。
前もって感謝します
ps何にreinterpret_cast
使われるかは知っていますが、このように使われているのを見たことがありません
c++ - C++ で reinterpret_cast<> を使用する際の問題
データストリームは固定幅メッセージで構成されており、各メッセージには固定幅フィールドも完全に定義されているため、データストリームを構造体にキャストしようとしています。構造体を作成し、reinterpret_cast を使用してデータストリームへのポインターを構造体にキャストし、フィールドを取得することを計画していました。テスト コードを作成したところ、奇妙な結果が得られました。なぜ私がこれらを取得しているのか、またはコードを修正する方法を説明できますか? (データストリームはバイナリと英数字が混在していますが、文字列でテストしているだけです)
出てきた結果は
nullターミネータが見つからないため、ourとurの4つが印刷されていると思います。null ターミネータの問題を回避するにはどうすればよいですか?
c++ - なぜこのreinterpret_castはコンパイルされないのですか?
reinterpret_cast
私はそれが危険であることを理解しています、私はそれをテストするためにこれをしているだけです。私は次のコードを持っています:
プログラムをコンパイルしようとすると、「
タイプ'float'からタイプ'doubleへの無効なキャスト
どうしたの?リンゴを潜水艦に変換するために使用できる不正なキャストだと思いreinterpret_cast
ましたが、なぜこの単純なキャストをコンパイルしないのですか?
c++ - Cスタイル、再解釈、およびconstキャストでの説明が必要
Cスタイルのキャスト(推奨されていません)はreinterpret_castsに過ぎないと思いますか?後者を使用すると、視覚的に印象的で、厄介なキャストを探すときに簡単に検索できるため、Cスタイルのキャストよりもお勧めしますか?
const_castを使用してconstをキャストし、元々constオブジェクトに書き込むことが定義されていない場合、const_castの目的は何ですか?
注: Bjarneは、キャスト操作が安全ではないことを正しく非難し、「醜い操作は醜い構文形式である必要があります」とさえ述べていることを知っています。したがって、C++でのキャスト演算子の冗長性。だから私はそれらの使用を最小限に抑えるようにします。約束。:)
c++ - unsigned char を reinterpret_cast なしで std::string に取得する方法は?
std::string に必要な unsigned char 配列がありますが、現在の方法では、回避したい reinterpret_cast を使用しています。これを行うためのよりクリーンな方法はありますか?
c++ - 厳密なポインタエイリアシング:特定の問題に対する解決策はありますか?
厳密なポインタエイリアシングルールに違反したために問題が発生しました。T
テンプレートからの型Int
と、同じサイズの整数型があります(と同様)sizeof
。私のコードは基本的に次のことを行います。
T
コンストラクターを持つことができる任意の(サイズ制限以外の)型であるため、との和集合を作成することはできませT
んInt
。(これはC ++ 0xでのみ許可されており、GCCではまだサポートされていません)。
機能を維持し、厳密なエイリアシングルールに違反しないように上記の擬似コードを書き直す方法はありますか?これはテンプレートであることに注意してください。制御しT
たり、値を設定したりすることはできませんsome_other_t
。割り当てとその後の比較は、テンプレート化されたコード内で行われます。
T
(ちなみに、ビットフィールドが含まれている場合、上記のコードはGCC 4.5で壊れ始めました。)