2016-04-21 12 views
7

Desidero dichiarare un array const const, che contiene stringhe con informazioni sulla versione.preprocessore C: la stringificazione non funziona

Ho già due macro con numeri di versione e voglio generare una stringa const iniziale basata su di esso.

Sto tentando di utilizzare l'approccio descritto here, ma non funziona come previsto con gli strumenti del compilatore disponibili.

Il mio codice è prossimo:

#define API_VERSION_MAJOR 4 
#define API_VERSION_MINOR 47 

#define _STR(x) #x 
#define STR(x) _STR(x) 

static const char OSAPIVersion[] = 
    STR(API_VERSION_MAJOR) "." STR(API_VERSION_MINOR) ; 

Quando stampo della matrice, il suo valore è "API_VERSION_MAJOR.API_VERSION_MINOR" invece di "4.47".

Uso un cross-compiler ARM GCC 4.4.1 personalizzato.

Quando faccio lo stesso sul mio PC con Cygwin GCC 4.5.3, funziona.

Grazie in anticipo per il vostro aiuto.

UPDATE:

Si è scoperto che API_VERSION_MAJOR e API_VERSION_MINOR macro erano unvisible in un file sorgente. Ho appena perso l'inclusione. Cosi 'semplice. Troppo semplice per essere ovvio.

Si noti che in questo caso non è presente alcun avviso.

+4

totalmente estranei al vostro problema, ma non utilizzare nomi di simboli con un trattino basso preceduto da una lettera maiuscola, in quanto sono riservati per la "implementazione" (es. compilatore e libreria standard). –

+3

Ho appena provato il frammento di codice con gcc 4.4, 4.8 e 4.9, i386, x64 e cross-arm su Ubuntu 12.04 e 14.04 - funziona come previsto (usando 'compiler -E testfile.c'). Penso che il problema risieda altrove. Sarebbe un grosso errore in un compilatore/preprocessore che non funzionasse altrimenti. – Dummy00001

+0

Il codice postato è stato copiato e incollato dal file sorgente? – LPs

risposta

7

Quindi il cross-compilatore GCC 4.4.1 ARM personalizzato è bacato.

Se lo hai compilato tu stesso, a volte aiuta a disabilitare alcune opzioni di ottimizzazione eccessivamente aggressive che potrebbero non avere appianato tutti i nodi.

Pensare fuori dagli schemi, si potrebbe modificare il codice sorgente per evitare il problema:

#define API_VERSION_MAJOR "4" 
#define API_VERSION_MINOR "47" 
static const char OSAPIVersion[] = API_VERSION_MAJOR "." API_VERSION_MINOR; 

o forse costruire la stringa in fase di esecuzione:

#define API_VERSION_MAJOR 4 
#define API_VERSION_MINOR 47 
static char OSAPIVersion[8]; 
int main(void) { 
    snprintf (OSAPIVersion, sizeof OSAPIVersion, "%d.%d", API_VERSION_MAJOR, API_VERSION_MINOR); 
}