2011-09-22 4 views
23

나는 거의이 코드와 깨끗한 NSLog를 마무리 타임 스탬프 및 프로그램 이름 : 내가 할 경우청소 NSLog -

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

이 잘 작동이 :

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

하지만, 실패 할 경우 I 사용자 그것은

NSLog(@"One argument"); 

때문에 __VA_ARGS__은 아무것도 아니다, 그래서

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

문제는 쉼표입니다. 이것이 매크로이므로 __VA_ARGS__은 아무 것도 아닙니다. 그래서 나는 을 생성하고 실패 할 것이므로 __VA_ARGS__==nil과 같은 일을 할 수 없습니다.

질문은 간단합니다. __VA_ARGS__이 아무것도 아닌 경우 어떻게해야합니까? 또는 더 많은 인수가있을 때만 쉼표를 사용하십시오.

- 편집 -

쉬이 셰가 문제를 해결합니다. 최상의 코드가 되려면 다음과 같이 사용하십시오.

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

이제 더 이상 지저분한 로그가 없습니다 !!!

답변

56

사용이 코드합니다 (## 부분을주의) :

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

작업 벌금을. 나는'##'이'__VA_ARGS__'와는 아무런 의미가 없지만 일한다고 생각했습니다. – Rodrigo

+4

printf ("% s \ n"을 fprintf (stderr, "% s \ n")로 변경해야합니다. 여러 가지 이유로, 가장 중요한 것은 printf가 캐시 된 stout으로 가고, stderr은 캐시되지 않고 바로 출력됩니다 –

+0

Hum .. @ Nathan Day. 이런 것들을보고 이해하지 못했지만, 상황이 나아 졌다면 나는 사용할 것이다 : – Rodrigo