Clean NSLog - нет метки времени и имени программы - PullRequest
26 голосов
/ 22 сентября 2011

Я почти заканчиваю чистую NSLog с этим кодом:

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

Это нормально работает, если я сделаю это:

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

Но произойдет сбой, если я его использую

 NSLog(@"One argument");

потому что __VA_ARGS__ это ничто, поэтому он производит

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

Итак, проблема в запятой. Поскольку это макрос, __VA_ARGS__ - ничто. Поэтому я не могу делать такие вещи, как __VA_ARGS__==nil, потому что выдаст ==nil и потерпит неудачу.

Вопрос прост: что делать, когда __VA_ARGS__ - это ничто? Или используйте запятую только тогда, когда есть больше аргументов.

1 Ответ

60 голосов
/ 22 сентября 2011

Используйте этот код (обратите внимание на ## часть):

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