[解決済み] reinterpret_castはいつ使うのか?
質問
の適用について少し混乱しています。
reinterpret_cast
対
static_cast
. 私が読んだ限りでは、コンパイル時に型が解釈できる場合は静的キャストを使用するのが一般的なルールで、そのため
static
. これは、C++コンパイラが暗黙のキャストに内部で使用しているキャストです。
reinterpret_cast
は、2つのシナリオで適用されます。
- 整数型からポインタ型への変換、またはその逆を行います。
- あるポインタ型から別のポインタ型に変換する。私が得た一般的な考えは、これは移植性がなく、避けるべきということです。
CからC++を呼び出す場合、CのコードはC++オブジェクトを保持する必要があります。
void*
. をどのようなキャストで変換すればよいのでしょうか?
void *
とClass型はどう違うのでしょうか?
の両方の使用法を見たことがあります。
static_cast
と
reinterpret_cast
? しかし、私が読んだ限りでは、それは
static
の方が、コンパイル時にキャストを行うことができるため、良いのでは?を使うように書かれていますが
reinterpret_cast
というのは、あるポインタ型から別のポインタ型に変換するためですか?
どのように解決するのですか?
C++の規格では、以下のことが保証されています。
static_cast
へのポインタと
void*
はアドレスを保持する。つまり、以下のように
a
,
b
と
c
はすべて同じアドレスを指しています。
int* a = new int();
void* b = static_cast<void*>(a);
int* c = static_cast<int*>(b);
reinterpret_cast
は、ポインタを別の型にキャストした場合のみ保証されます。
で、次に
reinterpret_cast
元の型に戻す
であれば、元の値を得ることができます。つまり、以下のように。
int* a = new int();
void* b = reinterpret_cast<void*>(a);
int* c = reinterpret_cast<int*>(b);
a
と
c
は同じ値を含んでいますが
b
は不定です。(と同じアドレスが含まれます。
a
と
c
が、これは標準では規定されておらず、より複雑なメモリシステムを持つマシンでは正しくないかもしれません)。
とのキャストの場合
void*
,
static_cast
が優先されます。
関連
-
[解決済み】getline()が何らかの入力の後に使用されると動作しない 【重複あり
-
[解決済み】C++ 式はポインタからオブジェクトへの型を持っている必要があります。
-
[解決済み】文字列関数で'char const*'のインスタンスを投げた後に呼び出されるterminate [閉店].
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み】Visual Studio 2013および2015でC++コンパイラーエラーC2280「削除された関数を参照しようとした」が発生する
-
[解決済み】Enterキーを押して続行する
-
[解決済み] static_cast, dynamic_cast, const_cast, reinterpret_cast はいつ使うべきですか?
-
[解決済み] スマートポインターとは何ですか?
-
[解決済み] 仮想デストラクタはいつ使うのか?
-
[解決済み] C++のdynamic_castとstatic_cast
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】 unsigned int vs. size_t
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み】識別子 "string "は未定義?
-
[解決済み】C-stringを使用すると警告が表示される。"ローカル変数に関連するスタックメモリのアドレスが返される"
-
[解決済み】C++の変数はイニシャライザーを持っているが、不完全な型?
-
[解決済み] 式はクラス型を持つ必要があります。
-
[解決済み】オブジェクト引数のない非静的メンバ関数の呼び出し コンパイラーエラー
-
[解決済み】エラー:free(): 次のサイズが無効です(fast)。
-
[解決済み] [Solved] インクルードファイルが開けません。'stdio.h' - Visual Studio Community 2017 - C++ Error
-
[解決済み] to_string は std のメンバーではない、と g++ が言っている (mingw)