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.
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
* 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.) –
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. –