【问题标题】:Appropriate cast for OSAtomicCompareAndSwapPtrBarrierOSAtomicCompareAndSwapPtrBarrier 的适当演员表
【发布时间】:2011-04-06 01:22:47
【问题描述】:

在这个程序中:

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* 而不会收到上述警告。我应该忽略警告,假设它是指针大小不统一时期的遗物,还是我误解了什么?

【问题讨论】:

    标签: c macos casting atomic void


    【解决方案1】:

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

    我相信在您的情况下,警告可以被忽略,或者可能通过显式强制转换消除:

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

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

    【讨论】:

      猜你喜欢
      • 2020-04-15
      • 2017-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多