0

私はかなりの C++ スキルを持っていますが、この 1 つのキャストで問題が発生しています。次のパラメータを受け取る関数があります: (volatile void **, void * , void*). 3 つint*の変数があり、それらを として渡そうとしてい(&var1, var2, var3)ます。ただし、次のエラーが表示されます: Cannot convert parameter 1 from int** to volatile void**. これを可能にするために作成する必要がある特定のキャストはありますか? 以下は、私が使用しているコードのスニペットです。どんな助けでも大歓迎です。

int* pVal = InterlockedCompareExchangePointer(&cur_val, new_val, old_val);

これは、Windows XP マシンの VS2010 で行われています。

4

3 に答える 3

3

最初のものは である必要がvolatile void **あり、あなたは持っていint **ます。volatile void**にキャストするか、(より良い) 元の変数を として宣言してからキャストすることができますvolatile

volatile変数はコード外の他の場所で変更できることを意味し、基本的には変数が最適化されないことを意味しますが、元の変数はvolatileまだ最適化されている可能性があるため定義されていないため、誤った結果が得られます。

于 2011-12-12T00:23:00.563 に答える
1

を実行することもできますが、変数を a (つまり へのポインター) として宣言するconst_castのが最善の方法です。そうしないと、結果が未定義になる可能性があります。volatile int*volatile int

InterlockedCompareExchangePointerオプティマイザの分析範囲を超える可能性のある操作を実行するため、変数がvolatile使用されるたびに、その値がメモリからフェッチされる (レジスタなどにキャッシュされない) ことを確認することが重要です。

于 2011-12-12T00:24:09.793 に答える
0

int を揮発性として宣言することに加えて、次のようにキャストする必要があります。

int* pVal = (int *)InterlockedCompareExchangePointer((void **)&cur_val, (void *)new_val, (void *)old_val);

関数から返される値のキャストにも注意してください。void * を返すため、int * にキャストする必要があります。

C++ では明示的なキャストが必要です。

于 2011-12-12T00:32:38.870 に答える