2011-09-22 11 views
23

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!

Odpowiedz

56

użyć tego kodu (zawiadomienie ## część):

#define NSLog(FORMAT, ...) fprintf(stderr, "%s\n", [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]); 
+0

działać prawidłowo. Myślałem, że '## 'nie ma sensu z' __VA_ARGS__', ale działa. – Rodrigo

+4

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 –

+0

Hum .. @Nathan Day Widziałem takie rzeczy i nie rozumiałem, ale jeśli to sprawi, że będzie lepiej, skorzystam :) – Rodrigo