我正在尝试将一些旧的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);
这个解决方案非常难看(而且我在考虑是否最好留下警告,因为在代码附近使用它时会发出重要提示)。还有其他解决方案吗?
答案 0 :(得分:3)
你的解决方案不仅丑陋,未定义的行为(UB)可能会在未来引起你的问题:
void*
指针的算术是非标准的,必须是
扩展您的编译器为避免第一次使用(char*)0 + my_data
,但这仍然会让你留下第二个。
你能做什么
uintptr_t
。这是一种保证的类型
与void*
兼容(如果存在)。它存在于最现代的
平台。优点是您的代码无法编译
它不存在的平台,清楚地表明你有
然后改变一些事情。但是,你必须修改被调用函数的来源,所以你最好把它改成第二种,就应该这样做。
答案 1 :(得分:1)
是的,传递对象的地址。
pthread_create(..., (void *)&mydata);
只要mydata
在某处仍然可用,那就应该是安全的编辑。
答案 2 :(得分:0)
将数据作为指针传递并不是一个好主意,但是如果有很多代码可以执行它 - 只需将其保留原样即可。 否则,我会通过cnicutar建议的地址。 请记住,如果mydata作用域在线程开始之前结束,则可能存在损坏问题。