错误:从'Foo *'转换为'unsigned int'会失去精度

时间:2010-10-09 22:35:14

标签: c++ casting intptr

我正在尝试将指针强制转换为int(或unsigned int),无论我尝试什么它都不想工作。

我已经尝试了static_cast<intptr_t>(obj)reinterpret_cast<intptr_t>(obj)以及C样式演员的各种组合,intptr_tunsigned int,并且我包含了stdint。 H。从我读过的内容来看,我尝试过的很多东西中的一件应该可行。是什么给了什么?

我没有打扰包括代码,因为它正是我所描述的,但是既然你问过,我已经尝试了所有这些以及其他组合:

void myfunc(Foo* obj)
{
    // ...
    uintptr_t temp = reinterpret_cast<uintptr_t>(obj);
    uintptr_t temp = static_cast<uintptr_t>(obj);
    uintptr_t temp = (uintptr_t)obj;
    intptr_t temp = reinterpret_cast<intptr_t>(obj);
    intptr_t temp = static_cast<intptr_t>(obj);
    intptr_t temp = (intptr_t)obj;
    unsigned int temp = reinterpret_cast<unsigned int>(obj);
    unsigned int temp = static_cast<unsigned int>(obj);
    unsigned int temp = (unsigned int)obj;
    // ...
}

他们都给出完全相同的错误。

2 个答案:

答案 0 :(得分:5)

您要么在sizeof (Foo*) > sizeof (unsigned)的平台上,要么您的编译器设置为警告不可移植的代码。请注意,大多数64位编译器(LP64和LLP64)都属于此类别。

不要求指针适合int。这就是intptr_t的全部内容。

如果您在callbacls期间使用仅为用户上下文提供int的第三方库,则可以将索引传递到查找表,因此指针本身存储在查找表中。这具有类型安全和不破坏别名假设的额外好处。

编辑:适合我。 (Comeau "tryitout"非常方便)

#include <stdint.h>

void myfunc(class Foo* obj)
{
    uintptr_t temp = reinterpret_cast<uintptr_t>(obj);
}
  

Comeau C / C ++ 4。3。10。1(2008年10月6日   对于ONLINE_EVALUATION_BETA2,请致电11:28:09   版权所有1988-2008 Comeau Computing。   版权所有。模式:严格   错误C ++ C ++ 0x_extensions

     

“ComeauTest.c”,第5行:警告:   变量“temp”已声明,但从未   引用         uintptr_t temp = reinterpret_cast(obj); reinterpret_cast(obj);

     

在严格模式下,使用-tused,编译成功(但请记住,Comeau在线编译器没有链接)。   编译时启用了C ++ 0x扩展。

在C89模式下,它也有效:

#include <stdint.h>

void myfunc(struct Foo* obj)
{
    uintptr_t temp = (uintptr_t)obj;
}
  

Comeau C / C ++ 4。3。10。1(2008年10月6日   对于ONLINE_EVALUATION_BETA2,请致电11:28:09   版权所有1988-2008 Comeau Computing。   版权所有。模式:严格   错误C90

     

“ComeauTest.c”,第3行:警告:   声明在外面是不可见的   function void myfunc(struct Foo *   OBJ)                        ^

     

“ComeauTest.c”,第5行:警告:   变量“temp”已声明,但从未   引用         uintptr_t temp =(uintptr_t)obj;                   ^

     

在严格模式下,使用-tused,编译   成功了(但请记住,Comeau   在线编译器没有链接)。

答案 1 :(得分:0)

当然,最好通过显式转换掌握类型转换。前面的答案说得很好。

但是我建议绕过编译器。有一个选项可以让编译器接受实际的精度损失:

gcc -fpermissive