2010-11-02 15 views

Respuesta

16

La cantidad de esfuerzo involucrado dependerá completamente de qué tan bien escrito esté el código original. En el mejor de los casos posibles, no habrá más esfuerzo que no sea volver a compilar. En el peor de los casos, tendrá que pasar mucho tiempo haciendo que su código sea "64 bits limpio".

problemas típicos:

  • suposiciones acerca de tamaños de int/long/puntero/etc
  • punteros asignación < => Ints
  • que dependen de argumento predeterminado o conversiones resultado de la función (es decir, no hay prototipos de funciones)
  • especificadores de formato printf/scanf inadecuados
  • suposiciones sobre el tamaño/alineación/relleno de las estructuras (especialmente en lo que respecta a la E/S de archivos o redes) O interactuar con otras API, etc.)
  • moldes inapropiados cuando se hace la aritmética de punteros con desplazamientos de bytes
+5

+1 Solo algunas adiciones: Un desagradable caso para los argumentos enteros son las funciones va_arg: todos los tipos enteros estrechos que corresponden al '...' se promoverán a 'int'. Entonces, el código que usa el entero 'typeof's con la semántica correcta como' size_t', 'uintptr_t',' ptrdiff_t', 'uint64_t' generalmente solo compila y ejecuta. Código que tiene abuso para 'int' en todas partes como variables de bucle,' 'aritmética' 'char' olvidando que esto podría estar firmado o no, y cosas así buscan problemas. Ejecute su código a través de diferentes compiladores con todas las advertencias activadas, 'clang' es un buen complemento a' gcc' –

+0

@Jens: gracias por los comentarios adicionales; el punto de construir y probar con múltiples compiladores es muy bueno. –

1

Simplemente no confíe en la suposición del tamaño de la palabra de la máquina? siempre use sizeof, stdint.h, etc. A menos que dependa de diferentes llamadas de biblioteca para diferentes arquitecturas, no debería haber necesidad de #ifdefs.

-1

La estrategia más fácil es construir lo que tienes con la configuración de 64 bits y poner a prueba a los diablos de la misma. Cierto código no necesita cambiar en absoluto. Otro código, generalmente con suposiciones erróneas sobre el tamaño de ints/pointers, será mucho más frágil y deberá modificarse para que no dependa de la arquitectura.

Muy a menudo los archivos binarios que contienen registros binarios causan la mayoría de los problemas. Esto es especialmente cierto en entornos donde los valores crecen de 32 bits a 64 bits en la transición a una compilación de 64 bits. Principalmente esto se debe al hecho de que los enteros se escriben de forma nativa en los archivos en su longitud actual (32 bits) y se leen usando una longitud incorrecta en una compilación de 64 bits donde los enteros son de 64 bits.

+1

Depende del compilador, por supuesto, pero todos los compiladores C de 64 bits que he usado (gcc, clang), dejan 'int' en 32 bits y hacen' long' 64 bits. – JeremyP

+1

@JeremyP: Depende del modelo de datos de plataforma (http://en.wikipedia.org/wiki/64- bit#Specific_C-language_data_models) en lugar del compilador. Por ejemplo, en Win64 tanto 'int' como' long' siguen siendo 32 bits, mientras que 'long long' es de 64 bits, por lo que el modelo es idéntico a Win32 para enteros, pero los punteros se convierten en 64 bits, por lo que el código intenta usar' int' o 'long' para mantener el valor de un puntero fallará - cambie a' intptr_t' donde sea necesario. – Clifford

Cuestiones relacionadas