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 !!!
bene lavoro. Pensavo che "##" non avesse senso con "__VA_ARGS__", ma funzionava. – Rodrigo
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 –
Hum .. @Nathan Day. Ho visto cose come questa e non ho capito, ma se le cose andranno meglio, userò :) – Rodrigo