2011-09-22 3 views
23

Ho quasi terminato un NSLog pulito con questo codice:Clean NSLog - No timestamp e il programma di nome

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

Questo bel lavoro se faccio questo:

NSLog(@"Show %@ message", @"this"); 

Ma, falliranno se io utente si

NSLog(@"One argument"); 

perché __VA_ARGS__ è nulla, in modo da produrre

printf("%s\n", [[NSString stringWithFormat:@"One argument",] UTF8String]); 

Quindi, il problema è la virgola. Perché questa è la macro, __VA_ARGS__ non è nulla. Quindi non posso fare cose come __VA_ARGS__==nil perché produrrà ==nil e fallirà.

La domanda è semplice: cosa fare quando __VA_ARGS__ non è nulla? Oppure usa la virgola solo quando hai più argomenti.

- Modifica -

Xuzhe risolvere il problema! Per essere il miglior codice, puoi utilizzarlo in questo modo:

#ifdef DEBUG 
#define NSLog(FORMAT, ...) fprintf(stderr,"%s\n", [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]); 
#else 
#define NSLog(...) 
#endif 

Ora, non più registri disordinati !!!

risposta

56

Usa questo codice (si noti la parte ##):

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

bene lavoro. Pensavo che "##" non avesse senso con "__VA_ARGS__", ma funzionava. – Rodrigo

+4

Dovresti cambiare il printf ("% s \ n" in fprintf (stderr, "% s \ n".) Per vari motivi, la cosa più importante, printf va a stout che è memorizzato nella cache, stderr non viene memorizzato nella cache viene immediatamente mostrato –

+0

Hum .. @Nathan Day. Ho visto cose come questa e non ho capito, ma se le cose andranno meglio, userò :) – Rodrigo