2010-12-07 32 views
-1

Je souhaite convertir des pointeurs de n'importe quel type en int en C et C++. Le code doit être le même pour C et C++. Le programme suivant fonctionne pour C mais pas pour C++.Distribution explicite en C

int main(void) 
{ 
    long long a; 
    int b = (int)&a; 

    return 0; 
} 

Comment puis-je le faire fonctionner pour C++?

+0

C++ est rétrocompatible avec C donc tout ce qui fonctionne dans C fonctionne en C++. – heavyd

+0

Il ne compile pas avec g ++. Si je l'avais dit, cela devrait fonctionner avec gcc et g ++? –

+14

@heavyd: Pas vrai. –

Répondre

6

On dirait que vous voulez que la macro offsetof, il est défini dans <stddef.h>.

Modifier: Vous avez changé votre exemple, maintenant vous devriez regarder intptr_t ou uintptr_t qui sont dans stdint.h. Ne pas, en aucun cas, mettre une adresse dans une plaine int.

+0

Est-il portable et est-il supporté par tous les compilateurs? –

+0

Mais je veux le mettre dans un _int_, c'est le point. De toute façon, intptr_t ne me permet pas d'y mettre un long long *. –

+0

Oui, 'offsetof' est spécifié par C89 et C++ 98 (et toutes les révisions ultérieures). – Jed

0

-vous dire:

struct X 
{ 
     char a; 
     long long b; 
}; 

int main(void) 
{ 
     int b[20]; 
     // C++ requires fixed size of arrays. 

     b[(int)(&((struct X*)0)->b) - 8] = 5; 
     // This will compile But what you get is not even worth guessing at. 

     return 0; 
} 
+0

Cela fonctionne également tant qu'une conversion d'un pointeur vers _int_ est effectuée. Mais je l'ai signifié pour le programme que j'ai écrit. –

+0

@ user95281: Vous avez modifié votre code, il est donc difficile de le savoir. Même s'il n'y a pas de conversion valide, votre nouveau code sera compilé. Si le pointeur est 64 bits et l'int est 32 bits, il compile tout de même bien. –