Concatena int alla stringa utilizzando il preprocessore C.


91

Sto cercando di capire come posso concatenare un #define'd int a una #define' d string utilizzando il preprocessore C. Il mio compilatore è GCC 4.1 su CentOS 5. La soluzione dovrebbe funzionare anche per MinGW.

Vorrei aggiungere un numero di versione a una stringa, ma l'unico modo per farlo funzionare è creare una copia del numero di versione definito come stringhe.

La cosa più vicina che ho trovato è stato un metodo per citare argomenti macro, ma non funziona per #defines

Questo non funziona.

Non funziona senza le #s sia perché i valori sono numeri e sarebbe espandono per "/home/user/.myapp" 2 6, che non è valido C .

Funziona, ma non mi piace avere copie delle definizioni di versione perché ne ho bisogno anche come numeri.


Risposte:


173

Domanda sul preprocessore C classico ...

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


3
STR () in questo caso darà una stringa stretta. C'è una variazione per convertirlo in una stringa larga?
gkns

5
Non saprei dire quante volte l'ho
cercato su Google

1
Il primo "STR_HELPER" è obbligatorio perché "#" funziona solo con un argomento macro. Mi ci è voluto un po 'di tempo per capirlo ..
clarkttfu

1
@clarkttfu, una specie di - sì, #funziona solo con argomenti macro. Tuttavia, la STR_HELPERmacro è necessaria per evitare di trasformare la macro MAJOR_VERnella stringa "MAJOR_VAR", dove vogliamo che sia il risultato "2".
Lindydancer

13

Un modo di lavorare è scrivere MY_FILE come macro parametrica:

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


1
A mio parere sincero, questa è la risposta migliore ed è molto più semplice degli altri suggerimenti. Sono sorpreso che non abbia ottenuto una valutazione migliore!
osirisgothra

5
È una soluzione pulita che, purtroppo, non funziona. Se l'argomento passato a MY_FILEsono macro, ad esempio Ae B, questa macro si espanderà in "/home..." "A" "B".
Lindydancer

2

Puoi farlo con BOOST_PP_STRINGIZE :


29
Mi fa sorridere il modo in cui la gente lancia Boost a tutto.
Frerich Raabe

4
@Frerich: Portando la tua argomentazione all'estremo, le persone dovrebbero scrivere prima i propri compilatori in codice macchina grezzo, piuttosto che lanciare g ++ su tutto ... Non ha senso reinventare la ruota. I bravi programmatori scrivono codice, i grandi riutilizzano.
Maxim Egorushkin

@jonescb: basta aprire l'intestazione boost e vedere di persona.
Maxim Egorushkin

11
Sì, l'ho provato. Ha funzionato, ma l'uso di un'intestazione Boost in un programma C mi sembra strano.
jonescb

1
Oh, colpa mia, non ho notato il Ctag.
Maxim Egorushkin
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.