0

我有相當不錯的C++技巧,但是這一次演員一直給我提出問題。我有一個函數,它具有以下參數:(volatile void **, void * , void*)。我有3 int*變量,我試圖通過他們作爲(&var1, var2, var3)。但是,我收到以下錯誤:Cannot convert parameter 1 from int** to volatile void**。是否有需要製作的特定演員陣容?以下是我正在使用的一段代碼。任何幫助是極大的讚賞。在C++中投射一個指向易失性void **的指針

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

這是在Windows XP機器上的VS2010中完成的。

+0

對不起,但InterlockedCompareExchangePointer返回什麼? – Monkeyanator

+0

這是通常的CAS成語:'CAS(storage,new_val,expected_old_val)',它返回在位置'storage'中找到的舊值 - http://msdn.microsoft.com/en-us/library/windows/desktop/ ms683568%28v = vs.85%29.aspx –

+0

嘿,我不確定這一點,但我懷疑你是否可以在函數調用中將非易失性變量轉換爲volatile。嘗試使原始指針變得不穩定並查看它是否有效? – Ankit

回答

3

第一個應該是volatile void **,你有int **。您可以投到volatile void**,或者(更好)將原始變量聲明爲volatile,然後投射。

volatile意味着變量可以在其他地方的代碼外修改,基本上就意味着變量不會被優化,但由於原來的變量沒有被定義爲volatile它可能仍然可以優化,你會得到錯誤的結果。

1

你可以做一個const_cast,但你可以做最好的事情就是聲明你的變量volatile int*(即指針volatile int),否則結果可能是不確定的。

InterlockedCompareExchangePointer確實可能超出優化程序的範圍來分析操作,所以是很重要的變量是volatile以確保它的值是從存儲器中取出(並在寄存器等不被緩存),每個正在使用它的時間。

0

除了聲明中的int揮發性,你仍然需要強制轉換爲:

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

注意從函數返回值的演員了。它返回一個void *,所以它必須轉換爲int *。

C++需要顯式強制轉換。