适用于OSAtomicCompareAndSwapPtrBarrier的强制转换

时间:2011-04-06 01:22:48

标签: c macos casting atomic void

在这个程序中:

int x, y; 
int *old = &x;
int *new = &y;
int * volatile cur = &x;

OSAtomicCompareAndSwapPtrBarrier(old, new, &cur);

我收到了这个警告:

  

不兼容的指针将'int * volatile *'传递给'void * volatile *'

类型的参数

在XCode 4.0.1的默认编译器上。 (实际问题,实际上。)

现在,我知道一般情况下我无法将int **转换为void **。但是,如果我不这样做,我没有看到任何方式比较和交换和int *没有得到上述警告。我应该忽略这个警告,假设它是一个非均匀指针大小的遗物,还是我误解了什么?

1 个答案:

答案 0 :(得分:0)

我认为警告说编译器认为从指针到指针到int到指针到指针到void的隐式转换是危险的。这并不是说你不能做这样的转换;标准表示只要满足类型对齐要求,指针就可以转换为指向不同类型对象的指针。但有时,例如如果使用strict aliasing,可能会导致问题。

我相信你的情况可以忽略警告,或者可以通过显式演员表消除警告:

bool result = OSAtomicCompareAndSwapPtrBarrier(old, new, &(void*)cur);

另外,请确保您不要忘记检查返回值;忽略原子比较和交换可能不成功(由于并发修改)的事实很少是安全的。

相关问题