2009-03-25 6 views
14

Sto provando a fare qualcosa come il seguente;Esiste una direttiva preprocessore GCC per verificare se il codice viene compilato su una macchina a 64 bit?

#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); 

Il 'd' variabile essendo del tipo 'intptr_t' esigenze '% d' identificatore di formato su macchine a 32 bit e di formato '% ld' su 64 macchine bit. Sto cercando una soluzione per poter compilare il codice su macchine a 32 bit e macchine a 64 bit senza apportare modifiche alla riga di comando GCC o al codice sorgente.

risposta

1

Una soluzione consigliata è rendere l'applicazione più prevedibile. Se lo fai dipendere dalla dimensione di un puntatore di memoria, potresti avere alcune sorprese indesiderate. Printf ne comprende solo alcuni tipi, se è necessario stampare un valore per un tipo che non è sempre possibile garantire che sia realmente noto, è molto meglio convertirlo in qualcosa di noto.

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

Questo è un buon consiglio e valido per qualsiasi tipo. Ad esempio, per stampare un PID Unix (cioè di tipo pid_t):

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

Non è necessario sapere qual è il tipo e la dimensione del pid, a condizione che il tipo di destinazione è abbastanza grande.

+0

Sono d'accordo con la tua filosofia generale, ma tieni presente che non devi dipendere da indicatori che si inseriscono in un lungo. Su Windows 64-bit, non lo fanno (http://msdn.microsoft.com/en-us/library/s3f49ktz(VS.71).aspx). Per i puntatori, "% p" è il modo giusto (come sottolineato da Fred Larsen). –

8

Si desidera utilizzare i macro PRI* definiti in inttypes.h. Li abiliti definendo __STDC\_FORMAT\_MACROS. È quindi possibile utilizzare

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

Il PRIxPTR macro si espanderà per llx se __WORDSIZE == 64 e lx o x altrimenti.

+0

+1 molto bello. Tuttavia, i risultati sul mio sistema Debian x86-64 sono leggermente diversi. "echo __WORDSIZE | g ++ -xC++ -include limits.h -P -E -" restituisce 64. "echo PRIxPTR | g ++ -xC++ -D__STDC_FORMAT_MACROS -include inttypes.h -E - | tail -1" restituisce "l" " X". – sigjuice

+0

Bene, i midi PRI * sono c99, quindi se puoi dimostrare che si comportano male sul tuo computer probabilmente dovresti segnalare un bug alle persone debian. – JesperE

+0

La mia ipotesi è la seguente: "l" "x" è "lx", che va bene se i puntatori e 'long' sono entrambi a 64 bit o entrambi a 32 bit; "llx" è davvero necessario per stampare un puntatore solo se 'sizeof (void *) == sizeof (long long)' but 'sizeof (long long)> sizeof (long)' –

Problemi correlati