2009-07-03 12 views
12

C'è un modo per ottenere il pre-processore C++ per espandere un valore # define in una stringa letterale?
per esempio:Puoi espandere # define in string letterali?

#define NEW_LINE '\n' 
Printf("OutputNEW_LINE"); //or whatever 

Questo mi sembra che dovrebbe essere possibile in quanto è prima della compilazione?
Oppure esiste un modello di progettazione migliore per ottenere questo tipo di comportamento (senza ricorrere a correzioni di runtime come sprintf)?

EDIT Capisco che # definiscono di può essere il male, ma per amor di argomenti ...

ULTERIORI Qualcuno ha qualche critica di questo approccio?

+0

@GMan qualsiasi alternativa 'meno brutta'? –

+5

Bene, puoi usare \ n direttamente in Stringhe. Lo standard C impone che questo singolo carattere venga esteso a qualsiasi piattaforma utilizzata come delimitatore/terminatore di riga, almeno quando si scrive su file di testo e sulla console. – Joey

risposta

25

Questo lo farà:

#define NEW_LINE "\n"   // Note double quotes 
Printf("Output" NEW_LINE); 

(tecnicamente è il compilatore unisce le stringhe piuttosto che il preprocessore, ma il risultato finale è lo stesso.)

6

se non ricordo male è

Printf("Output" NEW_LINE); 
+0

Quindi questo verrà espanso al momento della compilazione non tramite la funzione di formatura di Printf? –

+3

Sì, il compilatore C concatenerà automaticamente stringhe di stringhe adiacenti, anche se #define dovrebbe definire NEW_LINE come "\ n" e non "\ n" perché funzioni, penso. – Joey

+0

Perché il downvote, solo per la stampa maiuscola? – Kosi2801

2

È possibile effettuare quanto segue.

#define NEW_LINE "\n" 
printf("Output" NEW_LINE); 
-1

Bene ....

printf("Output%s", NEW_LINE); 
+0

Questo sarebbe un runtime correggi –

+0

esattamente, ma molto più facile da mantenere a lungo termine :) –

+0

mmmm ... Non proprio, dovresti ancora ricompilare tutto se la #define cambia e la virgola mancante non dovrebbe essere causa di problemi se qualcosa nel il testo cambia, dato che puoi ancora aggiungere segnaposto e variabili senza rompere qualcosa. Almeno secondo me. – Kosi2801

1
#define NEW_LINE "\n" 
printf("Output" NEW_LINE); //or whatever 

dovrebbe fare il trucco.