0

我有相当不错的 C++ 技能,但是这个演员给我带来了问题。我有一个接受以下参数的函数:(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,但你能做的最好的事情是声明你的变量 a volatile int*(即指向volatile int),否则结果可能是未定义的。

InterlockedCompareExchangePointer执行的操作可能超出优化器的分析范围,因此变量volatile确保每次使用时从内存中获取其值(而不是缓存在寄存器等中)很重要。

于 2011-12-12T00:24:09.793 回答
0

除了将 int 声明为 volatile 之外,您还需要将其转换为:

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

还要注意从函数返回的值的转换。它返回一个 void *,所以它必须转换为 int *。

C++ 需要显式转换。

于 2011-12-12T00:32:38.870 回答