2009-03-25 11 views
14

Estoy tratando de hacer algo como lo siguiente;¿Existe una directiva de preprocesador GCC para verificar si el código se está compilando en una máquina de 64 bits?

#ifdef 64-bit 
    #define DECIMAL_FORMAT %ld 
#else 
    #define DECIMAL_FORMAT %d 
#endif 
. 
intptr_t d; 
. 
printf(“Some message with DECIMAL_FORMAT in the middle of it\n”, d); 

La variable 'd' siendo del tipo 'intptr_t' necesidades '% d' especificador de formato en las máquinas de 32 bits y especificador de formato '% ld' en máquinas de 64 bits. Estoy buscando una solución para poder compilar el código tanto en máquinas de 32 bits como en máquinas de 64 bits sin hacer cambios en la línea de comando de GCC o el código fuente.

Respuesta

1

Una solución recomendada es hacer que su aplicación se comporte de manera más predecible. Si lo hace dependiente del tamaño de un puntero de memoria, puede tener algunas sorpresas indeseables. Printf solo entiende algunos tipos, si debe imprimir un valor para un tipo que no siempre puede garantizar que realmente se conoce, es mucho mejor convertirlo en algo conocido.

printf("Some message with %ld in the middle of it\n", (long) d); 

Este es un buen consejo y válido para cualquier tipo. Por ejemplo, para imprimir un Unix PID (que es de tipo pid_t):

pid_t pid = fork(); 
printf("Fork returned %d.\n", (int) pid); 

Usted no tiene que saber lo que es el tipo y tamaño del pid, siempre y cuando el tipo de destino es lo suficientemente grande.

+0

Estoy de acuerdo con su filosofía general, pero tenga en cuenta que no debe depender de punteros que encajen en un largo. En Windows de 64 bits, no lo hacen (http://msdn.microsoft.com/en-us/library/s3f49ktz(VS.71).aspx). Para los indicadores, "% p" es la forma correcta (como señaló Fred Larsen). –

8

Desea utilizar las macros PRI* definidas en inttypes.h. Usted los habilita definiendo __STDC\_FORMAT\_MACROS. A continuación, puede utilizar

intptr_t d = ... ; 
printf("This is an intptr_t: %" PRIxPTR "\n", d); 

La macro PRIxPTR ampliará a llx si __WORDSIZE == 64 y lx o x lo contrario.

+0

+1 realmente genial. Sin embargo, los resultados en mi sistema Debian x86-64 son ligeramente diferentes. "echo __WORDSIZE | g ++ -xC++ -include limits.h -P -E -" devuelve 64. "echo PRIxPTR | g ++ -xC++ -D__STDC_FORMAT_MACROS -include inttypes.h -E - | tail -1" returns "l" " X". – sigjuice

+0

Bueno, las macros PRI * son c99, por lo que si puede demostrar que se están portando mal en su máquina, probablemente deba informar un error a las personas de Debian. – JesperE

+0

Mi suposición es la siguiente: "l" "x" es "lx", lo cual está bien si los punteros y 'long' son tanto 64 bits como ambos 32 bits; "llx" es realmente necesario para imprimir un puntero solo si 'sizeof (void *) == sizeof (long long)' pero 'sizeof (long long)) sizeof (long)' –

Cuestiones relacionadas