通过虚空铸造枚举*

时间:2011-07-14 09:33:23

标签: c casting pthreads 32bit-64bit porting

我正在尝试将一些旧的32位代码转换为64位。我得到的一个更频繁的警告是:

警告:指向不同大小的整数的指针

当函数调用pthread_create接受void *以将数据传递给新线程时,会发生这种情况。调用线程放入void *一个枚举(因此64位的大小不匹配)。这是代码:

typedef enum {
zero,
one,
two
}numbers_e;

some_function(...)
{
    numbers_e mydata=zero;

    ...
    pthread_create(..., (void *)mydata);
    ...
}

我设法克服了这个警告:

pthread_create(..., (void *)0 + my_data);

这个解决方案非常难看(而且我在考虑是否最好留下警告,因为在代码附近使用它时会发出重要提示)。还有其他解决方案吗?

3 个答案:

答案 0 :(得分:3)

你的解决方案不仅丑陋,未定义的行为(UB)可能会在未来引起你的问题:

  • void*指针的算术是非标准的,必须是 扩展您的编译器
  • 不指向有效对象的指针算术是UB

为避免第一次使用(char*)0 + my_data,但这仍然会让你留下第二个。

你能做什么

  • 将您的价值转换为uintptr_t。这是一种保证的类型 与void*兼容(如果存在)。它存在于最现代的 平台。优点是您的代码无法编译 它不存在的平台,清楚地表明你有 然后改变一些事情。
  • 使用指向数据的指针。这是真正的解决方案,方式 pthreads设计

但是,你必须修改被调用函数的来源,所以你最好把它改成第二种,就应该这样做。

答案 1 :(得分:1)

是的,传递对象的地址。

pthread_create(..., (void *)&mydata);

只要mydata在某处仍然可用,那就应该是安全的编辑

答案 2 :(得分:0)

将数据作为指针传递并不是一个好主意,但是如果有很多代码可以执行它 - 只需将其保留原样即可。 否则,我会通过cnicutar建议的地址。 请记住,如果mydata作用域在线程开始之前结束,则可能存在损坏问题。