2012-05-04 4 views
7

pomimo faktu, że nie jest to dobra praktyka, kodowanie, chcę makro, które powinny działać jak następuje:C makro, które tworzy zmienną NSString z nazwą zmiennej jako treść napisu

CREATE_STRING(fooBar) 

I należy utworzyć następujący kod:

NSString *fooBar = @"fooBar"; 

Moje makro wygląda następująco:

#define CREATE_STRING(varName) NSString *varName = @"varName"; 

Bu t teraz uzyskać następujące

NSString *fooBar = @"varName"; 

Wydaje się, że taki łatwy problem do rozwiązania, a ja już sprawdziłem dokumentację from IBM ale ja po prostu nie może wydawać się uzyskać varName w ciąg.

Odpowiedz

10

To jak to zrobić

#define CREATE_STRING(varName) NSString *varName = @"" #varName 

trwa zaletą faktu, że dwie ciągłe stałe jedna po drugiej łączą się w kompilator.

+2

Czy ktoś faktycznie wypróbował moje rozwiązanie przed opuszczeniem? –

+0

Czym różni się to od odpowiedzi @ H2CO3? – trojanfoe

+1

Różni się tym, że łączy dwa ciągi, a nie tylko wstawia łańcuchową nazwę po znaku "@". –

14

Zastosowanie

#define CREATE_STRING(varName) NSString *varName = @#varName 

zamiast. (Również pamiętać, że nie trzeba średnik spływu, aby być w stanie „call” makra jako funkcję C-like).

+0

[...] Untitled.m: 7: 34: błąd: użycie niezadeklarowanego identyfikatora "foo"; miałeś na myśli "za"? NSString * mary = CREATE_STRING (foo); ^ Untitled.m: 3: 42: note: rozwinięty z makra 'CREATE_STRING' #define CREATE_STRING (varName) NSString * varName = @ # varName ^ 2 wygenerowane błędy. –

+0

Czy nazwałeś to CREATE_STRING (foo); (średnikiem na końcu przy dzwonieniu)? Jeśli nie, spróbuj to zrobić. Błąd NIE występuje w punkcie, w którym używane jest makro. –

+0

Po prostu zamieniłem twoją definicję makra na moją, aby uzyskać ten błąd, twój nie może działać. Można tylko stringify makr w preprocesorze, więc podejście używane w mojej odpowiedzi jest potrzebne do konwersji gołych znaków do makra, zanim zostanie usztywniona. –