Rob*_*cks 2 c++ pointers casting visual-c++
我需要一种简单的方法将指针转换为int,然后返回指针.我需要它作为可移植性的int,因为int在我的项目中比指针更容易携带.
启动播放器并返回指针:
SoundPlayer* player = new FxPlayerTiny();
return (int)player; // this works, but is it correct?
Run Code Online (Sandbox Code Playgroud)
使用指针int停止播放器:
FxPlayerTiny* player = static_cast<FxPlayerTiny*>((int*)num); // this gives me an error
FxPlayerTiny* player = (FxPlayerTiny*)((int*)obj); // this works, but is it correct?
delete player;
Run Code Online (Sandbox Code Playgroud)
最好的办法是修复你的项目,以便处理指针.整数和指针是两个不同的东西.您可以来回转换,但如果您不小心,此类转换可能会丢失信息.
int根据实现和底层平台,将指针值转换为或返回可能很容易丢失信息.例如,系统on int小于指针.如果你有32位int和64位指针,那么将一个指针转换为a int和back将几乎肯定会给你一个无效的指针.
它很可能足够long或unsigned long足够宽,以保持转换的指针值而不会丢失信息; 我从来没有在一个不是的系统上工作过.(就我个人而言,我倾向于选择无符号类型,但不是出于任何真正的理由;要么应该同样有效.)
所以你可以写,例如:
SoundPlayer* player = new FxPlayerTiny();
return reinterpret_cast<unsigned long>player;
Run Code Online (Sandbox Code Playgroud)
并使用将unsigned long值转换回指针reinterpret_cast,SoundPlayer*>.
较新的实现提供的typedef uintptr_t和intptr_t,这是保证往返指针到整数到指针转换正常工作无符号和符号整型.它们是在C99中引入的,并且可选地在<stdint.h>标题中定义.(指针大于任何整数类型的实现都不会定义它们,但这种实现很少见.)C++采用2011标准,在<cstdint>标题中定义它们.但是Microsoft Visual C++在2010版本中确实支持它们.
此保证仅适用于普通指针,而不适用于函数指针或成员指针.
所以,如果你必须这样做,你可以写:
#include <cstdint>
SoundPlayer* player = new FxPlayerTiny();
return reinterpret_cast<std::uintptr_t>player;
Run Code Online (Sandbox Code Playgroud)
但首先,考虑一下.new FxPlayerTiny()给你一个指针值,你会想要一个指针值.如果可能的话,只需将它作为指针.将其转换为整数意味着您必须决定使用哪种技术,并且必须跟踪整数值应该表示的指针类型.如果你犯了一个错误,要么使用一个不够大的整数类型,要么忘记你存储的指针类型,编译器可能不会警告你.
也许你有充分的理由需要这样做,但如果你能把指针存储为指针,你的生活会更容易.