2010-10-09 6 views
0

Je suis en train de jeter un pointeur vers un int (ou unsigned int) et peu importe ce que j'essayer ne veut pas travailler.erreur: fonte de « Foo * » à « unsigned int » perd la précision

J'ai essayé static_cast<intptr_t>(obj), reinterpret_cast<intptr_t>(obj) et diverses combinaisons de style C moulages, intptr_t 's, unsigned int' s, et je suis compris stdint.h. D'après ce que j'ai lu, l'une des nombreuses choses que j'ai essayées devrait fonctionner. Ce qui donne?

Je ne l'ai pas pris la peine, y compris le code parce qu'il est exactement ce que je l'ai décrit, mais puisque vous avez demandé, je l'ai essayé toutes ces combinaisons ainsi que d'autres:

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; 
    // ... 
} 

Ils donnent exactement la même erreur.

+1

Qu'est-ce que vous casting pour? Dites-nous le problème pas le pas. – GManNickG

+0

Pourquoi faites-vous cela? En outre, incluez le code de problème. – JoshD

+0

Quel compilateur utilisez-vous? –

Répondre

5

Vous êtes soit sur une plate-forme où sizeof (Foo*) > sizeof (unsigned) ou votre compilateur est réglé pour avertir sur le code non portable. Notez que la plupart des compilateurs 64 bits, LP64 et LLP64, appartiennent à cette catégorie.

Il n'y a pas besoin qu'un ajustement de pointeur dans un int. C'est tout le point de intptr_t. Si vous utilisez une bibliothèque tierce fournissant uniquement int pour le contexte utilisateur pendant les appels, vous pouvez passer un index dans une table de recherche, de sorte que le pointeur lui-même soit stocké dans la table de recherche. Cela a l'avantage supplémentaire d'être sûr de type et de ne pas briser les suppositions d'aliasing.

EDIT: Fonctionne pour moi. (Comeau "tryitout" est très pratique)

#include <stdint.h> 

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

Comeau C/C++ 4.3.10.1 (Oct 6 2008 11:28:09) for ONLINE_EVALUATION_BETA2 Copyright 1988-2008 Comeau Computing. All rights reserved. MODE:strict errors C++ C++0x_extensions

"ComeauTest.c", line 5: warning: variable "temp" was declared but never referenced uintptr_t temp = reinterpret_cast(obj);reinterpret_cast(obj);

In strict mode, with -tused, Compile succeeded (but remember, the Comeau online compiler does not link). Compiled with C++0x extensions enabled.

En mode C89 il fonctionne aussi:

#include <stdint.h> 

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

Comeau C/C++ 4.3.10.1 (Oct 6 2008 11:28:09) for ONLINE_EVALUATION_BETA2 Copyright 1988-2008 Comeau Computing. All rights reserved. MODE:strict errors C90

"ComeauTest.c", line 3: warning: declaration is not visible outside of function void myfunc(struct Foo* obj) ^

"ComeauTest.c", line 5: warning: variable "temp" was declared but never referenced uintptr_t temp = (uintptr_t)obj; ^

In strict mode, with -tused, Compile succeeded (but remember, the Comeau online compiler does not link).

+0

Droit, et j'ai essayé intptr_t, et j'ai toujours des erreurs. 'intptr_t test = reinterpret_cast (obj)' ne fonctionne pas. – Alex

+0

Est-ce la même erreur en utilisant 'intptr_t'? –

+0

Il s'avère donc que je suis un idiot: P J'ai eu une deuxième instance de ce quelque part dans mon dossier que j'avais oublié (cela compile bien btw sur mon autre ordinateur). Je continuais à voir les messages d'erreur même après avoir fait les choses correctement, mais ils pointaient maintenant vers l'autre instance de moi faisant un casting incorrect, et je n'avais pas remarqué le changement de numéro de ligne. Merci de votre aide – Alex

Questions connexes