C++ C++;和box2d:userdata将int强制转换为void*

C++ C++;和box2d:userdata将int强制转换为void*,c++,casting,box2d,C++,Casting,Box2d,我对box2d非常陌生,我尝试使用b2body对象中的userdata(类型为void*)字段来存储int值(枚举值,因此我知道对象的类型) 现在我正在做这样的事情: int number = 1023; void* data = (void*)(&number); int rNumber = *(int*)data; 我得到的值是正确的,但正如我一直在阅读有关“铸造到无效”的文章一样,它既不可移植,也不推荐使用。。。我的代码是否跨平台?它的行为是定义的还是依赖于实现的 谢谢 铸造

我对box2d非常陌生,我尝试使用b2body对象中的userdata(类型为void*)字段来存储int值(枚举值,因此我知道对象的类型)

现在我正在做这样的事情:

int number = 1023;

void* data = (void*)(&number);

int rNumber = *(int*)data;
我得到的值是正确的,但正如我一直在阅读有关“铸造到无效”的文章一样,它既不可移植,也不推荐使用。。。我的代码是否跨平台?它的行为是定义的还是依赖于实现的


谢谢

铸造到
void*
是可移植的。不建议这样做,因为您正在失去类型安全性。任何东西都可以放入
void*
,任何东西都可以取出。这使得射中自己的脚更容易。否则,
void*
可以,只要你非常小心。

void*的一个问题是,你需要知道(跟踪)它最初是什么类型,以便正确地铸造它。如果它最初是一个
float
,而你把它的大小写为
int
,编译器就会相信你的话

为了避免这种情况,您可以为包含该类型的数据创建一个包装器,这样您就可以始终将其转换为正确的类型


<>编辑:你还应该养成使用C++的流派风格而不是C的习惯,即代码> RealTytCase< /Calp>

< P> Vo.*是过去的遗迹(ISOC),但非常方便。你可以安全地使用它,只要你小心地前后转换你想要的类型。考虑其他选择,如C++类系统或重载函数

无论如何,您将有更好的强制转换操作符,有时没有其他方法(void*),有时它们太方便了

它可能导致不可移植的代码,这不是因为强制转换系统,而是因为有些人试图用它们进行不可移植的操作。最大的问题在于,(void*)与内存地址一样大,在许多平台上,它恰好也是平台整数的长度

但是,在一些罕见的例外情况下,大小(void*)!=大小(整数)


如果您尝试使用它们执行某些类型的操作/魔术,而不返回到所需的类型,则可能会出现问题。你可能会惊讶地发现,有多少次我看到人们想要将整数存储到void*指针中

你实际上并没有将
int
转换为
void*
,而是将
int*
转换为
void*
,这是完全不同的

指向任何类型的指针都可以存储在
void*
中,并可以重新转换回同一类型。这是肯定有效的


强制转换到任何其他类型都是不可移植的,因为语言标准没有规定不同的指针必须具有相同的大小或工作方式。只是
void*
必须足够宽才能容纳它们。

要回答您的问题,是的,这样做是安全的

为了回答您没有问的问题,这个空指针不是用来保持int的。Box2D有一个指针,可以让您指向游戏引擎中的实体对象,因此您可以将游戏中的实体与物理模拟中的实体相关联。当一个实体与另一个实体交互时,它允许您更容易地编程您的实体与另一个实体交互


所以你不应该只是把一个枚举放在那个空白处*。您应该将其直接指向由该b2body表示的游戏对象,其中可能包含枚举。

Windows API一直都在这样做(而且更糟)。如果除了一个空指针之外没有其他存储方法,那么就没有太多选择了。你可以做适当的C++版本,虽然(第一个没有演员,第二个是代码> STATICEXCAST