2012-04-03 3 views
2

"매크로화 된"매크로 ("#define name value, value, value"형식의 매크로)가 있습니다.이 매크로를 매크로에 전달하고 싶지만 오류가 발생하면 .매크로 매개 변수

예 : 시각 CI의 GET에서

void fn(int a, int b, int c){ return; } 

#define MACRO_1(a, b, c) fn(a, b, c) 
#define MACRO(...) MACRO_1(__VA_ARGS__) 
#define PARAM1 1 
#define PARAM2 2, 2 
#define PARAM3 3, 3, 3 

int main(int argc, char * argv[]){ 
    MACRO(0,0,0); 
    MACRO(PARAM1,1, 1); 
    MACRO(PARAM2,2); 
    MACRO(PARAM3); 
    return 0; 
} 

:. 이것은 비주얼 C++ 컴파일러의 버그

1>c:\main.c(10): warning C4003: not enough actual parameters for macro 'MACRO_1' 
1>c:\main.c(10): error C2059: syntax error : ',' 
1>c:\main.c(11): warning C4003: not enough actual parameters for macro 'MACRO_1' 
1>c:\main.c(11): error C2059: syntax error : ',' 
1>c:\main.c(12): warning C4003: not enough actual parameters for macro 'MACRO_1' 
1>c:\main.c(12): error C2059: syntax error : ',' 
1>c:\main.c(13): warning C4003: not enough actual parameters for macro 'MACRO_1' 
1>c:\main.c(13): error C2059: syntax error : ',' 
+0

Visual C에서 버그처럼 보입니다.'MACRO'는 여러 개의 인수 (...)를 사용하며 매크로에'#'또는'## '을 사용하지 않으므로 인수 (' PARAM1','PARAM2' 등)은 본문의'MACRO_1'이 검사되거나 확장되기 전에 확장되어야합니다. –

답변

6

컴파일러가 제대로 0,123 가변 인수 팩을 확장하지 않습니다이 다른 매크로의 인수로 나타납니다.

#define MACRO_1(a, b, c) fn(a, b, c) 
#define MACRO_1_(args_list) MACRO_1 args_list 
#define MACRO(...) MACRO_1_((__VA_ARGS__)) 

가 연결 Microsoft이 문제에 대한 버그가 있습니다 : "Variadic Macro Replacement."이 문제가있는 경우

해결 방법은 호출 MACRO_1 전에 확장 할 수있는 가변 인수 팩을 강제로 간접 계층을 사용하는 것입니다 중요한 버그 리포트를 upvote하시기 바랍니다.

+0

와우, 스마트 해킹. 고맙습니다. – Benjamin

+0

+1 upvoted +1과 MS 연결 : – Benjamin

+0

버그 보고서 링크에 "요청한 콘텐츠를 찾을 수 없거나 볼 수있는 권한이 없습니다." MSVC 11.0 –