2013-03-05 7 views
5

Ci deve essere un modo per fare questo ...Posso usare il preprocessore C per convertire un intero in una stringa?

Ho un file di intestazione, version.h con una linea ...

#define VERSION 9 

e alcuni file utilizzare il valore definito di VERSION come un numero intero Va bene.

Senza cambiare il modo in cui viene definito VERSIONE, Ho bisogno di costruire un inizializzato "che cosa" stringa che contiene tale valore, quindi ho bisogno di qualcosa di simile ...

char *whatversion = "@(#)VERSION: " VERSION; 

, ovviamente, questo non lo fa compilare, quindi in qualche modo ho bisogno di ottenere una stringa del valore pre-elaborato di VERSIONE dare essenzialmente questo ...

char *whatversion = "@(#)VERSION: " "9"; 

Tutte le idee? È possibile?

risposta

0

All'interno di una macro, è possibile utilizzare l'operatore "stringa i" (#) che farà esattamente quello che vuoi:

#define STR2(x) #x 
#define STR(x) STR2(x) 
#define STRING_VERSION STR(VERSION) 

#define VERSION 9 

#include <stdio> 
int main() { 
    printf("VERSION = %02d\n", VERSION); 
    printf("%s", "@(#)VERSION: " STRING_VERSION "\n"); 
    return 0; 
} 

Sì, avete bisogno del doppio indirezione nella macro chiamata. Senza di esso, riceverai "VERSION" invece di "9".

È possibile leggere ulteriori informazioni a riguardo nello gcc manual (sebbene sia completamente standard C/C++).

+0

Perfetto! Grazie mille! –

5

Non è un tipo di dati, è un token. Un blob di testo.

K & R parlare di valori concatenare:

The preprocessor operator ## provides a way to concatenate actual arguments 
during macro expansion. If a parameter in the replacement text is adjacent 
to a ##, the parameter is replaced by the actual argument, the ## and 
surrounding white space are removed, and the result is re-scanned. For example, 
the macro paste concatenates its two arguments: 

    #define paste(front, back) front ## back 

    so paste(name, 1) creates the token name1. 

- provare che. #define la stringa prima di arrivare a char *version=

+0

È possibile incollare solo token, il che è piuttosto limitante. Ad esempio, non è possibile generare facilmente una stringa e '# (@) VERSION' è * non * un token, quindi non può essere concatenato con nulla. ('" # (@) VERSION "' è un token, ma non è possibile concatenare un token di stringa ad un altro token, a meno che quel token non sia un indicatore di lunghezza.Per fortuna, non è necessario concatenare i token stringa.) – rici

Problemi correlati