prawie kończąc czystą NSLog z tym kodem:Clean NSLog - Nie datownik i Program nazwa
#define NSLog(FORMAT, ...) printf("%s\n", [[NSString stringWithFormat:FORMAT, __VA_ARGS__] UTF8String]);
Ta praca dobrze, jeśli mogę to zrobić:
NSLog(@"Show %@ message", @"this");
Ale nie powiedzie się, jeśli użytkownik to
NSLog(@"One argument");
ponieważ __VA_ARGS__
ma nic, więc produkować
printf("%s\n", [[NSString stringWithFormat:@"One argument",] UTF8String]);
Problemem jest przecinek. Ponieważ jest to makro, __VA_ARGS__
jest niczym. Więc nie mogę robić rzeczy takich jak __VA_ARGS__==nil
, ponieważ będą produkować ==nil
i nie uda się.
Pytanie jest proste: co zrobić, gdy __VA_ARGS__
jest niczym? Lub użyj przecinka, gdy masz więcej argumentów.
- Edytuj -
Xuzhe rozwiązać problem! Aby uzyskać najlepszy kod, można go użyć w następujący sposób:
#ifdef DEBUG
#define NSLog(FORMAT, ...) fprintf(stderr,"%s\n", [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);
#else
#define NSLog(...)
#endif
Teraz już nie ma bałaganów!
działać prawidłowo. Myślałem, że '## 'nie ma sensu z' __VA_ARGS__', ale działa. – Rodrigo
Powinieneś zmienić printf ("% s \ n" na fprintf (stderr, "% s \ n") Z różnych powodów, przede wszystkim, printf przechodzi do portera, który jest buforowany, stderr nie jest buforowany, jest wyprowadzany od razu –
Hum .. @Nathan Day Widziałem takie rzeczy i nie rozumiałem, ale jeśli to sprawi, że będzie lepiej, skorzystam :) – Rodrigo