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++需要显式强制转换。