2011-03-18 3 views
2

다음 코드는 정상적으로 컴파일됩니다. 내가 함수에 다른 템플릿 매개 변수를 추가하면 내 코드의 실제 매크로가 더 복잡하다는C++ 매크로 문제 (쉼표 해석)

#define CMD_MACRO(pp, cmd) \ 
{   \ 
     if (pp)\ 
     { cmd; }  \ 
} 

template<class T> void operate_on(T &data, char c) { 
    data=data+1; 
}; 

int main() { 
    int book=4; 
    char c; 
    CMD_MACRO(book, { 
     operate_on<int>(book, c); 
    }); 
}; 

주, 나는

이제 더 논리적 이해가되지 수있는 단순화 된 버전을 제공해야 함 (문제가 코드 주석에서 설명) 컴파일 오류를 제공합니다 :

template<class T, bool b> void operate_on(T &data, char c) { 
    data=data+1; 
}; 
int main() { 
     int book=4; 
     char c; 
     CMD_MACRO(book, { 
      operate_on<int, false>(book, c); /* here the "," between int and 
        false is being treated 
        as separating arguments to CMD_MACRO, 
        instead being part of 'cmd'. Thats strange 
        because the comma separating book and c is 
        treated fine as part of 'cmd'. */ 
     }); 
}; 


test.cpp:18:6: error: macro "CMD_MACRO" passed 3 arguments, but takes just 2 
test.cpp: In function 'int main()': 
test.cpp:16: error: 'CMD_MACRO' was not declared in this scope 

이 문제를 해결하는 방법 (I 코드를 기존 여분의 템플릿 매개 변수를 추가해야하고 이러한 오류를 얻고있다).

+1

새로운 질문에는 몇 가지 우수한 답변이 있습니다. http://stackoverflow.com/questions/13842468/comma-in-c-c-macro/13842784#13842784 – jjrv

답변

6

시도해 보셨습니까? (operate_on<int, false>(book, c));? 표현식 주위에 여분의 괄호가 있음을 주목하십시오.

저는 전처리 기가 C++ 템플릿을 전혀 모른다고 생각하여 <>을 이전 토큰으로 취급합니다. 여분의 괄호가 없으면 operate_on<int을 하나의 인수로 처리하고 false>(book, c)을 다른 인수로 처리합니다.

+1

오른쪽. 전처리 기는'()'이나'{}'또는'{}'또는'<>'에 대해서는 알지 못합니다. – aschepler

+0

전 처리기는 구문 분석 할 때 언어만큼 똑똑하지 않습니다. 나는 종종 매크로 인자에 여분의 괄호를 추가해야했다. –

+0

위대한 .. 그것은 작동합니다 .. "("주변 코드가 "{"이고 유효한 구문입니다.) – jeetu