我正在尝试将指针强制转换为int(或unsigned int),无论我尝试什么它都不想工作。
我已经尝试了static_cast<intptr_t>(obj)
,reinterpret_cast<intptr_t>(obj)
以及C样式演员的各种组合,intptr_t
,unsigned 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;
// ...
}
他们都给出完全相同的错误。
答案 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