2014-07-19 4 views
2

조건부로 매크로를 "(a"또는 "b")로 확장하려고하지만 순진한 방법으로 컴파일러 중 하나에서 작동하지 않습니다 (Microsoft C/C++ 및 NDK 컴파일러). 예 :BOOST_PP_IF를 BOOST_PP_LPAREN과 어떻게 조합합니까?

// This works on both compilers, expands to (a) as expected 
#define PARENS_AND_SUCH BOOST_PP_IF(1, BOOST_PP_LPAREN() a BOOST_PP_RPAREN(), b) 

// MSVC: syntax error/unexpected end of file in macro expansion 
// NDK: unterminated argument list 
#define PARENS_AND_SUCH BOOST_PP_IF(1, BOOST_PP_LPAREN() a, b) 

// Desired expansion: (a 
// MSVC expansion: (a, b) 
// NDK: error: macro "BOOST_PP_IIF" requires 3 arguments, but only 2 given 
#define PARENS_AND_SUCH BOOST_PP_IF(1, BOOST_PP_LPAREN() a, b BOOST_PP_RPAREN()) 

내가 뭘 잘못하고 있니?

+0

귀하의 문제는 [이 질문에있는 것과 매우 유사하게 보입니다.] (http://stackoverflow.com/questions/24770614/how-do-i-expand-a-macro-containing-commas-inside-a -boost-pp-if). – llonesmiz

답변

1

당신은 subdefinitions에 IF의 가지를 추출하여 예상 하나에 부합하는 평가의 순서를 강제하고, 조건 돌아갈 때까지 지점 자신의 확장을 지연시킬 : THENELSE 때문에

#define PARENS_AND_SUCH BOOST_PP_CAT(PAS_, BOOST_PP_IF(1, THEN, ELSE)) 
#define PAS_THEN BOOST_PP_LPAREN() a 
#define PAS_ELSE b BOOST_PP_RPAREN() 

을 완전한 이름이 아닌 경우 IF이 확장되기 전에 분기가 확장되지 않습니다. 반환 할 때 값은 PAS_과 결합되어 새로운 유효한 정의를 형성하고 그 시간에 확장됩니다.

당신은 또한 THENELSE 매크로의 파라미터와이 기술이 더 일반적인 (그리고 IMO 더 우아) 만들 수 : 불완전한 이름으로 매개 변수를 전달 같은 방식을 근본적으로 썽크를 형성하고, 꽤 많은 작업 (불완전한 기능과 같은 매크로 이름은 완료 될 때까지 더하기 매개 변수 목록을 통해 전달됩니다).

관련 문제