C ++使用(void *)转换为int进行比较?

时间:2012-02-05 20:31:46

标签: c++ objective-c casting int void-pointers

我(尝试)在ObjC项目中编写一些(工作)C ++ :-) C ++库(Box2D)为我提供了一个b2Fixture类,它有一个“用户数据”属性,供编码人员存储相关的东西他们。

在我的情况下,它只需要存储一个整数。从我在ObjC的主程序中,一个是将整数转换为void *:

headFixture->SetUserData( (void*) 10 );

在程序的C ++方面的实用程序方法中,我想将用户数据与给定的整数进行比较(即它们是常量,10 =实地,11 =平台等)。

首先比较使用(void *)拒绝编译。在SO上找到了一种不同的方法,如第二次比较所示,它使用*((intptr_t *)...)。那个编译,但它发送EXC_BAD_ACCESS:

bool AbstractContactListener::contactContainsType(JRContact contact, int type){

    if (( type == ( (void *) contact.fixtureA->GetUserData() )) ||
        ( type == *( (intptr_t *) contact.fixtureB->GetUserData() ))
        ) {
        return true;
    }

    return false;
}

我没有想法来解决这个问题。 请帮忙 :-) 谢谢! 学家

EDIT /溶液

bool AbstractContactListener::contactContainsType(JRContact contact, int type){

    if (( type == (intptr_t) contact.fixtureA->GetUserData() ) ||
        ( type == (intptr_t) contact.fixtureB->GetUserData() )
        ) {
        return true;
    };

    return false;
}

这个对我有用!

3 个答案:

答案 0 :(得分:5)

我不确切地知道你要做什么,但你应该将数据转换回你想要的类型:

if (( type == reinterpret_cast<int>(contact.fixtureA->GetUserData() )) ||
    ( type == reinterpret_cast<int>(contact.fixtureB->GetUserData() ))
    ) {

答案 1 :(得分:2)

据我所见,你只需要把它丢掉;你需要使用一个整数类型,它保证与转换为通过的指针的大小相同,否则编译器可能会出错;

#include <stdint.h>

if(type == (intptr_t)(contact.fixtureA->GetUserData())) {

但有一点需要注意,据我所知,C标准不能保证将int转换为void *和back以返回相同的值。更安全的选择可能是使用指针,因为它们是使用的;

int *value = malloc(sizeof(int));
*value = 10;
headFixture->SetUserData( value );

if(type == *(int*)(contact.fixtureA->GetUserData())) {

不应该诱使任何编译器破坏你的代码。

答案 2 :(得分:1)

您想使用reinterpret_cast<int>。如果您收到错误,那么您就没有完全按照您所说的那样做。 (可能您正试图将void *取消引用为int *。)

int stored_type = reinterpret_cast<int>(contact.fixtureA->GetUserData());