2016-08-15 9 views
0

C 전처리 기의 작동 방식에 대한 질문이 있습니다. 아래 코드를 작성했습니다. OPREP(n)을 사용하면 OP(0,OP(1,OP(2,OP(3, .... OP(n,과 같이 표시됩니다. 그렇다면 내가 얻고 자했던 것은 whatever)))))))과 같은 것을 오른쪽 괄호로 n과 같이 붙이면 OP(0,OP(1,OP(2,OP(3, .... OP(n,whatever)))))))이되고 0 1 2 3 4 5 .... n whatever으로 평가되어야합니다. OP(0 , OP(1 , 3)) : 평가되지 않은 다른 매크로를 평가 한 매크로

#include <boost/preprocessor/comma.hpp> 
#include <boost/preprocessor/repetition/repeat.hpp> 
#include <boost/preprocessor/punctuation/paren.hpp> 

#define OP(a,b) a b 
#define T0() OP 
#define OPMAC(z,n,s) T0()BOOST_PP_LPAREN() n BOOST_PP_COMMA() 
#define OPREP(n_) BOOST_PP_REPEAT(n_, OPMAC, a) 

OPREP(2) 3)) 

내가 컴파일하고 내가 할 처리기 출력 살펴

. 즉, 결과 OP() 매크로를 평가하지 않았습니다. 제 질문이 왜 그런가요, 어떻게 강제 평가할 수 있습니까?

+0

이 나에게 XY 문제처럼 조금 소리를; 실제로 출력하려는 ​​것은 무엇입니까? 왜 수동으로 표현식의 오른쪽 절반을 입력하고 왼쪽 부분을 생성 하시겠습니까? –

+0

@ m.s. 이것은 최소한의 예입니다. 실제로 매크로'OP'는 실행중인 카운터 인 text1과 text2의 3 가지 인수를 취합니다. 중첩 된 각 OP 호출의 text1과 text2는 광범위하게 변경됩니다 (따라서이 매개 변수를 편집 할 수 있기를 원합니다.이 예제에서와 같이 단 하나의 매개 변수가 아니라 여러 개의 중첩 된 '어떤 것이 든'). 오른쪽 부분은 변경되지 않지만 실행중인 카운터가있는 OP뿐입니다. 만약 n = 20이라면 OP (0, OP (1, OP (2 20 times))를 쓰는 것이 꽤 짜증나는데, 다른 구현이 가능하다는 것을 깨달을 수 있는데 몇 가지를 생각할 수 있습니다. –

답변

1

알아 냈습니다. 또 다른 평가를 강제로 나는 그것의 매개 변수로 같은 일에 평가 더미 FORCE_EVAL 매크로를 추가하고 내 전화 묶어야하기 만하면 모든 :

#include <boost/preprocessor/comma.hpp> 
#include <boost/preprocessor/repetition/repeat.hpp> 
#include <boost/preprocessor/punctuation/paren.hpp> 

#define OP(a,b) a b 
#define T0() OP 
#define OPMAC(z,n,s) T0()BOOST_PP_LPAREN() n BOOST_PP_COMMA() 
#define OPREP(n_) BOOST_PP_REPEAT(n_, OPMAC, a) 
#define FORCE_EVAL(...) __VA_ARGS__ 

FORCE_EVAL(OPREP(2) 3))) 
+0

자신의 대답을 수락하는 것을 잊지 마십시오. – llonesmiz