2009-06-03 5 views
5

Necesito representar los punteros como cadenas para el usuario. A veces los valores pueden guardarse en un archivo y transferirse a una computadora con una arquitectura diferente (32 vs 64 bit es el problema principal en la actualidad) y cargarse desde un archivo de texto para comparar. Solo voy a comparar los valores cargados entre sí., pero aún prefiero comparar números que cadenas.¿Cuál es la mejor forma portátil de representar puntero como cadena en C++?

actualmente estoy usando:

SomeClass* p; 
... 
printf("%ld", (uintptr_t)p); 

pero me pregunto si esto es portátil (Windows y Linux sólo son importantes en esta etapa, aunque), y si esto rompería una vez que los sistemas de 128 bits aparecen?

Editar: a menos que decida usar uint64_t, y decida que 64 bits es el techo, no se puede hacer porque un puntero de 64 bits puede estar fuera del rango de 32 bits. Entonces, decidí que sería más seguro comparar cadenas incluso si es más lento.

Respuesta

20

Para los punteros, siempre use %p --- es un especificador de formato especialmente diseñado para imprimir punteros en el formato correcto. :-)

+1

Pero no es portátil. Al menos, no da salida consistente entre plataformas. En Visual Studio, los valores hexadecimales aparecen en mayúsculas.En gcc, minúsculas. – user48956

+2

* sacude la cabeza * ¿Vale la pena preocuparse por esa diferencia? Puede _no_ tener direcciones aparecen de la misma manera en todas las plataformas --- por ejemplo, en los programas de DOS en modo real de 16 bits, las direcciones generalmente se imprimen en formato xxxx: yyyy. (No puede eliminar los dos puntos "solo para ser consistente entre plataformas" --- eso sería muy engañoso, porque el espacio de direcciones en los programas de DOS en modo real no es plano.) –

+0

por ej., 0x11110000 y 0x11120000, en el modelo de direccionamiento plano , está a 0x10000 bytes de distancia. Sin embargo, en los programas de DOS de 16 bits en modo real, 1111: 0000 y 1112: 0000 están separados por 16 bytes. –

7

printf tiene un formateador p% que creo que está estandarizado:

printf("%p", p); 

pero como usted está usando C++, ya ostreams sobrecarga de salida puntero:

#include <iostream> 
using namespace std;; 

class A {}; 

int main() { 
    A a; 
    cout << &a << endl; 
} 

produce:

0x22ff6f 
+0

muy, muy estandarizado. :-P –

+1

Ten cuidado. Como también se especializan en el operador de salida para char * e imprimir una C-String. –

9

Haría esto:

std::cout << p; 

Si usted tiene su corazón puesto en cstdio:

printf("%p", p); 
+1

Gracias Fred. En realidad, estoy usando wxWidgets que tiene la función wxString :: Format que usa snprintf internamente, por eso necesito el ejemplo de printf. –

3

¿Está buscando la cadena %p formato?

printf("%p", p); 

Esta voy a dar la dirección hexadecimal codificado por el puntero apunta a (y, creo, formatos NULL s para usted también).

0

lo habría hecho:

cout << p << endl; 

Cuerdas (de la misma codificación) son portátiles. Si desea compararlos como punteros, primero debe analizar la cadena en un unsigned long.

En cuanto a los sistemas de 128 bits, están lejos. Con 64 bits, puede abordar directamente 16,8 millones de terabytes de RAM.

0

También se puede hacer como

printf ("% # x", p);

Esto garantizaría un formato similar (0x ...) en todas las plataformas.

Cuestiones relacionadas