2012-08-03 3 views
3

가변 인수를 허용하는 NSLog()처럼 작동하도록 매크로를 가져 오려고합니다. 아래의 코드는 구문 분석 문제를 일으 킵니다.__VA_ARGS__ 매크로 확장

이것을 정의하는 올바른 방법은 무엇입니까?

#define TF_CHECKPOINT(f, ...) \ 
do { \ 
NSString *s = [[NSString alloc] initWithFormat:f arguments:__VA_ARGS__] autorelease]; \ 
[TestFlight passCheckpoint:[NSString stringWithFormat:@"%@: %@", [self class], s]]; \ 
} while (0) 
+0

나는'__VA_ARGS__' 이미 매크로 변수 인수를 나타 내기 때문에 당신이'NSLog를 사용 하듯이 다음과 같은 매크로를 사용할 수 있도록, _variable arguments_을 의미하는 방법을 잘 모르겠어요 (...)'보통 :'# AnotherLog (...) NSLog (__ VA_ARGS __)'를 정의하면 소스 코드에서 유효한 행이됩니다 :'AnotherLog (@ "% d, % @", 1 , @ "text"); 최종 목표는 정확히 무엇입니까? – holex

답변

7

autorelease 메시지의 여는 괄호를 잊어 버렸습니다.

-[NSString initWithFormat:arguments:]va_list 인수를 요구하지만 __VA_ARGS__은 전달 된 모든 인수로 대체됩니다. 여기에 -[NSString initWithFormat:] 또는 +[NSString stringWithFormat:]을 사용해야합니다.

마지막으로 __VA_ARGS__의 접두사를 ##으로 지정할 수 있습니다. 이렇게하면 앞의 쉼표가 인수가 없을 때 삭제됩니다.

이 시도 :

#define TF_CHECKPOINT(f, ...) \ 
do { \ 
NSString *s = [NSString stringWithFormat:(f), ##__VA_ARGS__]; \ 
[TestFlight passCheckpoint:[NSString stringWithFormat:@"%@: %@", [self class], s]]; \ 
} while (0) 
+0

@Plenilune 뭐든간에. – trojanfoe

+0

좋아, 어리석은 실수로 오프닝 브래킷을 잊어 버렸다. – Morrowless