2011-01-20 2 views
2

variadic 매크로로 보낸 첫 번째 실제 매개 변수를 가져 오려고합니다. 이것은 내가 뭘하려하고, 이는 VS2010에서 작동하지 않습니다 : 다른 한편으로variadic 매개 변수만을 사용하여 매크로에 보낸 첫 번째 매개 변수를 단번히 처리하는 방법

#define FIRST_ARG(N, ...) N 
#define MY_MACRO(...) decltype(FIRST_ARG(__VA_ARGS__)) 

내가 FIRST_ARGMY_MACRO로 전송되는 전체 인수 목록을 반환하는 것을 볼 수 처리기 출력을보고 ...

시도 할 때 손을 :

FIRST_ARG(1,2,3) 

의도 한대로 확장됩니다.

이것은 악명 높은 2 레벨 concat 매크로가 해결 한 문제의 반대의 것처럼 보입니다. 나는 "매크로 매개 변수가 매크로 몸체에 삽입되기 전에 완전히 확장되었다"는 것을 알고 있습니다. 그러나 이것이 문맥에서이 의미가 무엇을 의미하는지 이해하지 못하기 때문에 여기에 도움이되지 않습니다 ... 그리고 __VA_ARGS__

분명히 __VA_ARGS__ binds N으로 변경되며 나중에 평가됩니다. 여분의 매크로 수준으로 여러 가지 방법을 시도했지만 도움이되지 않았습니다.

답변

6

이것은 a bug in the Visual C++ preprocessor입니다. 거기에 나열된 해결 방법이 작동합니다. 내가 그 링크가 잠재적으로 도움이 보이는 "해결 방법"을 가지고 있습니다

decltype(x) 
+0

이 :에

#define FIRST_ARG_(N, ...) N #define FIRST_ARG(args) FIRST_ARG_ args #define MY_MACRO(...) decltype(FIRST_ARG((__VA_ARGS__))) MY_MACRO(x, y, z) 

을 확장합니다. – aschepler

+1

@aschepler : 예; 나는 그것을 보면서 OP의 유스 케이스로 테스트했다. 그것은 잘 작동하고 나는 답변에 데모를 추가했습니다. 이 해결 방법은 매크로를 작성할 때 "처음에는 성공하지 못하면 더 많은 괄호를 추가하십시오."라는 가장 중요한 규칙을 보여줍니다. ;-) –

+0

참고 사항 [여기] (https://stackoverflow.com/questions/5134523/msvc-doesnt-expand-va-args-correctly/5134656#5134656) – ghd

관련 문제