Używam makra uprościć powrocie zlokalizowane ciągi, tak:Objective-C: „format string nie jest ciągiem dosłowny (potencjalnie niebezpieczny)” ostrzeżenie z makro
#define GetLocalStr(key, ...) \
[NSString stringWithFormat:[[NSBundle mainBundle] localizedStringForKey:key value:@"" table:nil], ##__VA_ARGS__]
Zasadniczo, jeśli masz wpis w Strings lokalizacji pliku, podobnie jak "name" = "My name is %@";
, nazywając
GetLocalStr(@"name", @"Foo");
zwróci NSString @"My name is Foo"
Gdy go jednak, jak:
NSString * str = GetLocalStr(@"name", @"Foo");
Otrzymuję komunikat "ciąg formatu nie jest literałem ciąg". Nawet po rady innych odpowiedzi na SO temat tego ostrzeżenia i zastąpienie go:
NSString * str = [NSString stringWithFormat:@"%@", GetLocalStr(@"name", @"Foo")];
wciąż otrzymuję ostrzeżenie, a poza tym to rodzaj pokonuje punkt makro ułatwienie życia.
Jak mogę pozbyć się ostrzeżenia przed owijaniem wszystkich połączeń GetLocalStr
w tłumikach #pragma?
Edycja 27/08
Po uruchomieniu przez odpowiedź CRD i robi kilka testów, wydaje się, że zrobiłem złe założenie o błędzie. Aby wyjaśnić:
plik lokalizacyjne Struny:
"TestNoArgs" = "Hello world";
"TestArgs" = "Hello world %@";
Kod:
NSString * str1 = GetLocalStr(@"TestNoArgs"); // gives warning
NSString * str2 = GetLocalStr(@"TestArgs", @"Foo"); // doesn't give warning
Większość moich tłumaczeń podjąć żadnych argumentów, a te były te dające ostrzeżenie, ale Nie nawiązałem połączenia, dopóki nie przeczytam odpowiedzi CRD.
zmieniłem jednego makra do dwóch, tak jak poniżej:
#define GetLocalStrNoArgs(key) \
[[NSBundle mainBundle] localizedStringForKey:key value:@"" table:nil]
#define GetLocalStrArgs(key, ...) \
[NSString stringWithFormat:[[NSBundle mainBundle] localizedStringForKey:key value:@"" table:nil], ##__VA_ARGS__]
A jeśli zadzwonię każdy oddzielnie, nie ma ostrzeżenia.
Chciałbym GetLocalStr
rozwinąć albo GetLocalStrNoArgs
lub GetLocalStrArgs
zależnie czy jakieś argumenty zostały przekazane lub nie, ale tak daleko I już nie mając szczęścia (makra nie są moją mocną stroną: D).
Używam sizeof(#__VA_ARGS__)
do określenia, czy są jakieś argumenty przekazane - to stringifys argumentów, a jeśli rozmiar jest 1, jest pusty (tj. "\ 0"). Być może nie jest to metoda najbardziej idealna, ale wydaje się działać.
Gdybym przepisać mój GetLocalStr
makro do:
#define GetLocalStr(key,...) (sizeof(#__VA_ARGS__) == 1) ? GetLocalStrNoArgs(key) : GetLocalStrArgs(key,##__VA_ARGS__)
mogę go używać, ale ja wciąż dostać ostrzeżenia wszędzie jest używany i nie ma przekazywane argumenty, podczas gdy coś
#define GetLocalStr(key,...) \
#if (sizeof(#__VA_ARGS__) == 1) \
GetLocalStrNoArgs(key) \
#else \
GetLocalStrArgs(key,##__VA_ARGS__)
won” t skompilować. Jak mogę uzyskać prawidłowe powiększanie makra GetLocalStr
?
'@" name "= @" Nazywam się% @ ";' - literały nie są przypisywane, nie będą się kompilować. 'NSString * format = @" Nazywam się% @ "; NSString * str = GetLocalStr (format, @ "Foo"); NSLog (@ "% @", str); 'nie wyrzuca żadnych ostrzeżeń (spodziewałem się, że tak jest tylko w definicji' GetLocalStr'), możesz chcieć poprawić cytaty i podać więcej szczegółów na temat miejsca ostrzeżenia. –
Możesz utworzyć kategorię NSString, aby zrobić to za Ciebie. –
@ A-Live "@" name "= @" Moja nazwa to% @ "' linia znajduje się w pliku lokalizacyjnym Strings, więc technicznie powinna być po prostu "name" = "Moja nazwa to% @" - przepraszam, jeśli to nie było jasne. Ostrzeżenie jest oznaczone na linii 'NSString * str = GetLocalStr (...);' linia – divillysausages