2012-01-13 6 views
6

Zdefiniowałem makro MYMACRO. Uwaga: wartość nie jest prawidłowym NSString.Jak rozszerzyć MAKRO na NSString bez użycia konkatenacji ciągów w czasie wykonywania?

#define MYMACRO is 

Makro służy wewnątrz deklarację o NSString

@"This MYMACRO fun" 

Jednak preprocesor nie rozszerza makro. Wcześniej przetworzone wynik jest

@"This MYMACRO fun" 

Najlepszym rozwiązaniem znalazłem tak daleko, aby dostać makra, aby rozwinąć to:

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

Makro rozwija się jak poniżej, który jest ważny Objective-C składnia:

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

Wymaga to jednak 2 konkatenacji w czasie wykonywania.

Moje pytanie brzmi: jak wstawić makro insto NSString bez użycia żadnych ciągów konkatenacji w czasie wykonywania?

Idealnie chciałabym runtime wykonać @"This is fun" zamiast @"This "@"is"@" fun"

Odpowiedz

6

Jestem prawie pewna, co masz już jest łączenie w czasie kompilacji, a nie starcie.

+1

Masz rację. Jeśli wygenerujesz złożenie dla kodu, który obsługuje konkatenację w ten sposób, możesz zobaczyć, że kończy się on jako jeden ciąg .asciiz. – UIAdam

+0

Myślę, że warto dodać, że nawet jeśli konkatenacja nastąpiła w czasie wykonywania, nie warto pochylać się do tyłu, aby napisać jakieś brzydkie makro, aby zapisać kilka operacji na ciągach. Najpierw napisz wyraźny kod, a potem martw się o wydajność. Osobiście chciałbym spojrzeć na użycie stringWithFormat, aby wstawić jeden NSString wewnątrz innego. – UIAdam

+0

@AdamW: Czy myślisz, że kompilator optymalizuje @ "To" @ "jest" @ "zabawa" na @ "To jest zabawne" podczas kompilacji? Zgadzam się z tobą, wolę mieć prosty kod źródłowy, zamiast zapisywać kilka operacji na ciągach. Wpadam w przedwczesną optymalizację i wszyscy wiemy, co to znaczy: "Przedwczesna optymalizacja jest źródłem wszelkiego zła - D. Knuth" –

-2
#define MYMACRO @"is" 
[NSString stringWithFormat:@"This %@ fun",MYMACRO] 
Powiązane problemy