2012-01-13 10 views
6

Ho definito una macro MYMACRO. Nota: il valore non è una NSString valida.Come espandere una MACRO in NSString senza utilizzare alcuna concatenazione di stringhe in fase di runtime?

#define MYMACRO is 

La macro viene utilizzato all'interno la dichiarazione di un NSString

@"This MYMACRO fun" 

Tuttavia, il preprocessore non espande la macro. Il risultato pre-elaborato è

@"This MYMACRO fun" 

La soluzione migliore che ho trovato finora per ottenere la macro di espandersi è:

#define MYMACRO @"is" 
@"This "[email protected]" fun" 

La macro si espande, come di seguito che è una valida la sintassi Objective-C:

@"This "@"is"@" fun" 

Tuttavia, ciò richiede 2 concatenazioni in fase di esecuzione.

Quindi la mia domanda è come inserire una macro in un NSString senza utilizzare alcuna concatenazione di stringhe in fase di esecuzione?

Idealmente, vorrei che il tempo di esecuzione eseguire @"This is fun" piuttosto che @"This "@"is"@" fun"

risposta

6

Sono abbastanza certo quello che hai già concatenare in fase di compilazione, e non runtime.

+1

Sei corretto. Se si genera l'assembly per il codice che fa una concatenazione come questa, si può vedere che finisce come una stringa .asciiz. – UIAdam

+0

Penso che valga anche la pena di aggiungere che anche se la concatenazione è avvenuta in fase di esecuzione, non vale la pena arrendersi all'indietro per scrivere qualche brutta macro solo per salvare alcune operazioni con le stringhe. Scrivi prima il codice chiaro e poi preoccupati delle prestazioni. Personalmente guarderei usando stringWithFormat per inserire una NSString all'interno di un'altra. – UIAdam

+0

@AdamW: Vuoi dire che il compilatore ottimizza @ "Questo" @ "è" @ "divertente" in @ "Questo è divertente" al momento della compilazione? Sono d'accordo con te, preferisco avere un semplice codice sorgente invece di salvare alcune operazioni con le stringhe. Sto cadendo nell'ottimizzazione prematura e sappiamo tutti cosa significa: "L'ottimizzazione prematura è la radice di tutti i mali - D. Knuth" –

-2
#define MYMACRO @"is" 
[NSString stringWithFormat:@"This %@ fun",MYMACRO] 
Problemi correlati