Concatena int a stringa usando C Preprocessor

Sto cercando di capire come concatenare un #define ‘d int a una stringa #define usando il Preprocessore C. Il mio compilatore è GCC 4.1 su CentOS 5. La soluzione dovrebbe funzionare anche per MinGW.

Mi piacerebbe aggiungere un numero di versione su una stringa, ma l’unico modo per farlo funzionare è fare in modo che una copia del numero di versione sia definita come stringhe.

La cosa più vicina che ho trovato era un metodo per citare argomenti macro, ma non funziona con #define s

Questo non funziona.

 #define MAJOR_VER 2 #define MINOR_VER 6 #define MY_FILE "/home/user/.myapp" #MAJOR_VER #MINOR_VER 

Non funziona senza # s perché i valori sono numeri e si espanderebbe in "/home/user/.myapp" 2 6 , che non è C valido.

Funziona, ma non mi piace avere copie della versione definite perché anch’io ne ho bisogno come numeri.

 #define MAJOR_VER 2 #define MINOR_VER 6 #define MAJOR_VER_STR "2" #define MINOR_VER_STR "6" #define MY_FILE "/home/user/.myapp" MAJOR_VER_STRING MINOR_VER_STRING 

Domanda di preprocessore C classica ….

 #define STR_HELPER(x) #x #define STR(x) STR_HELPER(x) #define MAJOR_VER 2 #define MINOR_VER 6 #define MY_FILE "/home/user/.myapp" STR(MAJOR_VER) STR(MINOR_VER) 

Il livello aggiuntivo di riferimento indiretto consentirà al preprocessore di espandere le macro prima che vengano convertite in stringhe.

Un modo efficace è scrivere MY_FILE come macro parametrica:

 #define MY_FILE(x,y) "/home..." #x #y 

EDIT: Come notato da “Lindydancer”, questa soluzione non espande le macro negli argomenti. Una soluzione più generale è:

 #define MY_FILE_(x,y) "/home..." #x #y #define MY_FILE(x,y) MY_FILE_(x,y) 

Puoi farlo con BOOST_PP_STRINGIZE :

 #define MAJOR_VER 2 #define MINOR_VER 6 #define MY_FILE "/home/user/.myapp" BOOST_PP_STRINGIZE(MAJOR_VER) BOOST_PP_STRINGIZE(MINOR_VER)