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() 매크로를 평가하지 않았습니다. 제 질문이 왜 그런가요, 어떻게 강제 평가할 수 있습니까?
이 나에게 XY 문제처럼 조금 소리를; 실제로 출력하려는 것은 무엇입니까? 왜 수동으로 표현식의 오른쪽 절반을 입력하고 왼쪽 부분을 생성 하시겠습니까? –
@ m.s. 이것은 최소한의 예입니다. 실제로 매크로'OP'는 실행중인 카운터 인 text1과 text2의 3 가지 인수를 취합니다. 중첩 된 각 OP 호출의 text1과 text2는 광범위하게 변경됩니다 (따라서이 매개 변수를 편집 할 수 있기를 원합니다.이 예제에서와 같이 단 하나의 매개 변수가 아니라 여러 개의 중첩 된 '어떤 것이 든'). 오른쪽 부분은 변경되지 않지만 실행중인 카운터가있는 OP뿐입니다. 만약 n = 20이라면 OP (0, OP (1, OP (2 20 times))를 쓰는 것이 꽤 짜증나는데, 다른 구현이 가능하다는 것을 깨달을 수 있는데 몇 가지를 생각할 수 있습니다. –