問題タブ [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++ - C++ で unsigned long (DWORD) を signed long として再解釈するにはどうすればよいですか?
unsigned long
(実際には a DWORD
) を として再解釈したいsigned long
。私は試した:
ただし、VC++ 2010 Intellisense は「無効な型変換」を教えてくれます。なんで?どうすれば修正できますか?
c++ - c++0xフラグを使用してwxWidgetsをコンパイルする
を使用してフラグを使用しwxWidgets-2.9.1
てソースからコンパイルしようとしているとき。エラーに遭遇しましたc++0x
gcc-4.6
narrowing conversion of '128' from 'int' to 'char' inside { } [-fpermissive]
ファイル内src/gtk/dcclient.cpp
。エラーは次のファイルから発生します。
- src / gtk / bdiag.xbm
- src / gtk / cdiag.xbm
- src / gtk / fdiag.xbm
- src / gtk / horiz.xbm
- src / gtk / verti.xbm
- src / gtk / cross.xbm
これは既知のバグです。 http://trac.wxwidgets.org/ticket/12575 必要に応じて実行しましたが、プログラムは正常にコンパイルされています。
diff
基本的に、ファイルには2種類の修正があります
//ファイル内dcclient.h
ハッチング[i]=gdk_bitmap_create_from_data(NULL、bdiag_bits、bdiag_width、bdiag_height); ハッチング[i]=gdk_bitmap_create_from_data(NULL、reinterpret_cast <const char *>(bdiag_bits)、bdiag_width、bdiag_height);
//ファイルbdiag.xbmおよびすべての*.xbmファイルの同様の修正
static char bdiag_bits [] = {
static unsigned char bdiag_bits [] = {0x80、0x80、0x40、0x40、0x20、0x20、0x10、0x10、0x08、0x08、0x04、0x04、0x02、0x02、0x01、0x01、0x80、0x80、0x40、0x40、0x 0x20、0x10、0x10、0x08、0x08、0x04、0x04、0x02、0x02、0x01、0x01};
私は2番目を理解しましたfix
が、最初のものを理解できませんでした。なぜ関数を実行する必要があるreinterpret_cast< const char* >
のですか?関数gdk_bitmap_create_from_data
は次のように宣言されています。
GdkBitmap* gdk_bitmap_create_from_data (GdkDrawable *drawable, const gchar *data, gint width, gint height);
数行後の同じファイルdcclient.cppで、次のを呼び出してgdk_bitmap_create_from_data
もエラーは発生しません。
ここでは、型キャストは必要ありません。なぜreinterpret_castを実行する必要があるのstatic unsigned char*
ですか?
c++ - 内部配置が新しいクラスのセーフコピーコンストラクターを実装する方法(std :: stringを使用)
これが私のコードです:
std::stringが内部的に割り当てられている場合を適切に処理するコピーコンストラクターを追加する方法に関する提案をいただければ幸いです。
c++ - 互換性のない型からキャストされたゼロデータ構造体のメンバー関数を呼び出しています-未定義ですか?
変更不可能なヘッダーで宣言されたフォワードC構造体があります。それにコンビニエンスメンバー関数を「仮想的に」追加したいと思います。明らかに、私の最初の選択は、構造体を拡張し、派生クラスにメソッドを追加することです。構造体自体がヘッダーで「転送」として宣言されているため、実行できません。そのため、「エラー:不完全な型の無効な使用...」というエラーが発生します。古い構造体の単一の要素を使用して新しい構造体を定義しようとすると、同様のエラーが発生します。これは最悪だ。
ただし、reinterpret_castを使用してハッカーを実行し、とにかく機能させることができると考えていました。それが行く方法はこれです:
タイプBからタイプAへの暗黙の変換を追加した場合、これはBがAのゼロデータ継承者であるかのように機能する可能性があると考えていました。しかし、これは明らかに疑問を投げかけます。これはC ++では未定義ですか?通常、違法にキャストされた構造体の要素にアクセスすることは定義されていないと思います。それは理にかなっている。ただし、あるタイプから別のタイプにreinterpret_castingし、そのポインターを渡してから、間に違法なことを何もせずに再度キャストするのは問題ないと思います。また、コンパイラが非仮想構造体メンバーを実装する方法は、関数を作成することだと思います
そして、Bの適切な引数を使用してそれを呼び出します。これは、前のケースに還元されます。これは、私の疑わしい論理では問題ありません。したがって、実際にはreinterpret_castAである構造体で.do_somethingを呼び出しても問題ないと思います。
ただし、これは、C++標準が実際に問題について述べていることについては何も述べていません。それで何か助けはありますか?また、誰かがこれが実際にどれだけうまく機能するかについての情報を持っている場合(つまり、「これまでに作成されたすべてのコンパイラがこれを受け入れる」、または「これは少数のコンパイラでのみ機能する」)、それも役立ちますが、少し劣ります。
c++ - unsigned を signed と解釈する
私は組み込みプラットフォーム (ARM) で作業しており、ビット パターンを扱うときは注意が必要です。この行が私の影響を超えているふりをしましょう:
署名なしと解釈すると、これは 206 になります。しかし、実際には署名されているため、-50に似ています。この値を署名済みとして引き続き使用するにはどうすればよいですか?
どちらでもない (すべての入力値に対して 0x10 または 0x00 になる)
ビットをそのままにしておきたいだけです。(bar == 0xCE)
逆に、ビットパターンを台無しにすることなく、負の数を表すビットパターンを符号なし変数に入れる方法に興味があります。私はGCCを使用しています。
c++ - reinterpret_cast を使用して C++ で派生クラス ポインターにキャストする方法
これが私のテスト例です:
s を印刷する行でクラッシュします。「b」は派生クラスへのポインターであるため、reinterpret_cast は機能するはずです。なぜクラッシュするのか不思議です。同時に、reinterpret_cast を dynamic_cast に置き換えると、機能します。
c++ - 標準のレイアウトタイプとreinterpret_cast
構造体のメンバーをクラスにコピーした場合、クラスから構造体にキャストすることはできますか?
c++ - C++ reinterpret_cast、一意の番号を作成
最近、コードを使用しint
てクラスの一意の番号を作成しています。
reinterpret_cast<int>(my_unique_name)
wheremy_unique_name
はchar []
一意の値を持つ変数を使用しました。以下のようなもの:
私の質問は、生成されたすべてのエントリ文字列に対してint
本当に一意ですか?
c++ - クラス オブジェクト ポインタをメッセージ キューの char * にパックする
POSIXメッセージキューを介してクラスオブジェクトポインタを適切かつ安全に渡すことは可能ですか?
例えば、
受信側では、reinterpret_cast
back to my Object
?を実行します。
Linux ではメッセージ キューがファイル記述子を使用するため、これがどのように機能するのか興味があります。私は失敗しましたが、何か間違ったことをしているのではないかと思います。
c++ - メンバー関数の引数にreinterpret_castを使用する
ここにいくつかのコードがあります:
上記の定義を変更できないと仮定した場合、「constcontainerC&」型の引数を使用してmyTypeの「someFunction」メソッドを呼び出すことができるメカニズムは何でしょうか。
私が見つけたのは、myTypeから新しい型を公に派生させ、reinterpret_castを使用して「someFunction」を次のように再定義することだけでした。
これは安全ですか?私の推測では、someFunctionでの使用方法に関しては、containerBとcontainerCの演算子に依存します。
すべてのコンテナはテンプレート化されていますが、これは違いはありません。継承階層の問題です。
非常に重要:containerAを引数としてcontainerBとcontainerCに対して明示的な型変換が定義されているため、containerCを直接引数としてmyType :: someFunctionに渡すことができますが、この場合、コピーの構築が行われます。まさに私が避けたいもの。
いくつかの特定のメモ:
- containerBとcontainerCの両方の属性はまったく同じです
- someFunctionは、コンテナ要素にアクセスするためにopearator []のみを使用し、
- operator + =(ただし、これはテンプレート要素レベルで定義されます)
containerBとcontainerCは、2つの一般的な異なるタイプではありません。containerCにはいくつかのメンバー関数が追加されているだけで、オブジェクトの内部データは変更されていません。