在这个程序中:
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 *没有得到上述警告。我应该忽略这个警告,假设它是一个非均匀指针大小的遗物,还是我误解了什么?
答案 0 :(得分:0)
我认为警告说编译器认为从指针到指针到int到指针到指针到void的隐式转换是危险的。这并不是说你不能做这样的转换;标准表示只要满足类型对齐要求,指针就可以转换为指向不同类型对象的指针。但有时,例如如果使用strict aliasing,可能会导致问题。
我相信你的情况可以忽略警告,或者可以通过显式演员表消除警告:
bool result = OSAtomicCompareAndSwapPtrBarrier(old, new, &(void*)cur);
另外,请确保您不要忘记检查返回值;忽略原子比较和交换可能不成功(由于并发修改)的事实很少是安全的。