在 C++ 中将指针转换为 volatile void**
Posted
技术标签:
【中文标题】在 C++ 中将指针转换为 volatile void**【英文标题】:Casting a pointer to a volatile void** in C++ 【发布时间】:2011-12-12 00:17:04 【问题描述】:我有相当不错的 C++ 技能,但是这个演员给我带来了问题。我有一个接受以下参数的函数:(volatile void **, void * , void*)
。我有 3 个int*
变量,我试图将它们作为(&var1, var2, var3)
传递。但是,我收到以下错误:Cannot convert parameter 1 from int** to volatile void**
。是否需要制作特定的演员表才能做到这一点?下面是我正在使用的代码 sn-p。非常感谢任何帮助。
int* pVal = InterlockedCompareExchangePointer(&cur_val, new_val, old_val);
这是在 Windows XP 机器上的 VS2010 中完成的。
【问题讨论】:
对不起,InterlockedCompareExchangePointer 返回什么? 这是通常的 CAS 习语:CAS(storage, new_val, expected_old_val)
,它返回在位置 storage
中找到的旧值 -- msdn.microsoft.com/en-us/library/windows/desktop/…
嘿我不确定这一点,但我怀疑你是否可以在函数调用中将非易失性变量转换为易失性。尝试使原始指针变为 volatile 并查看它是否有效?
@Ankit:反过来说:你可以安全地从非易失性转换到易失性,但反过来却不行。
【参考方案1】:
第一个应该是volatile void **
,你有int **
。您可以直接转换为volatile void**
,或者(更好)将原始变量声明为volatile
,然后再转换。
volatile
表示该变量可以在代码之外的其他地方更改,基本上这意味着该变量不会被优化,但由于您的原始变量未定义为volatile
它可能仍会被优化,你会得到不正确的结果。
【讨论】:
【参考方案2】:您可以使用const_cast
,但最好的方法是您可以将变量声明为volatile int*
(即指向volatile int
的指针),否则结果可能是未定义的。
InterlockedCompareExchangePointer
执行的操作可能超出优化器的分析范围,因此变量为volatile
以确保每次都从内存中获取其值(而不是缓存在寄存器等中),这一点很重要正在使用中。
【讨论】:
【参考方案3】:除了将 int 声明为 volatile 之外,还需要将其转换为:
int* pVal = (int *)InterlockedCompareExchangePointer((void **)&cur_val, (void *)new_val, (void *)old_val);
还要注意函数返回值的转换。它返回一个 void *,所以它必须转换为 int *。
C++ 需要显式转换。
【讨论】:
以上是关于在 C++ 中将指针转换为 volatile void**的主要内容,如果未能解决你的问题,请参考以下文章
在 C 和 C++ 中将 int 值转换为 char 指针差异