나는BOOST_PP_AUTO_REC의 기능은 무엇입니까?
# define BOOST_PP_ENUM BOOST_PP_CAT(BOOST_PP_ENUM_, BOOST_PP_AUTO_REC(BOOST_PP_REPEAT_P, 4))
사람이 BOOST_PP_AUTO_REC이 무엇을 설명 할 수 정의 부스트에서 만난? 문서에서 설명을 찾을 수 없습니다. 이 매크로는 실제로 무엇입니까?
나는BOOST_PP_AUTO_REC의 기능은 무엇입니까?
# define BOOST_PP_ENUM BOOST_PP_CAT(BOOST_PP_ENUM_, BOOST_PP_AUTO_REC(BOOST_PP_REPEAT_P, 4))
사람이 BOOST_PP_AUTO_REC이 무엇을 설명 할 수 정의 부스트에서 만난? 문서에서 설명을 찾을 수 없습니다. 이 매크로는 실제로 무엇입니까?
BOOST_PP_AUTO_REC
도움말은 술어를 사용하여 2 진 검색을 수행하여 Automatic Recursion에 사용 된 재귀 수준을 추론합니다. 첫 번째 인수는 술어이고 두 번째 인수는 검색 될 크기입니다. 술어는 pred(n)
이라고하며, pred
이 술어이고 n
이 값입니다.
때문에 매크로가 Automatic Recursion에 사용되는, 때문에 술어가 0이 술어가 1
을 반환하는 모든 값 앞에 와야 반환하는 모든 값이 술어는 사용할 수없는 자동 재귀를 사용하는 매크로.
는 예를 들어, 반복의 조건은 다음과 같이 정의된다 : BOOST_PP_REPEAT_1
가 재귀 적으로 호출되는 경우
# define BOOST_PP_REPEAT_P(n) BOOST_PP_CAT(BOOST_PP_REPEAT_CHECK_, BOOST_PP_REPEAT_ ## n(1, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3, BOOST_PP_NIL))
#
# define BOOST_PP_REPEAT_CHECK_BOOST_PP_NIL 1
# define BOOST_PP_REPEAT_CHECK_BOOST_PP_REPEAT_1(c, m, d) 0
# define BOOST_PP_REPEAT_CHECK_BOOST_PP_REPEAT_2(c, m, d) 0
# define BOOST_PP_REPEAT_CHECK_BOOST_PP_REPEAT_3(c, m, d) 0
그래서,이 확장되지 않습니다. 따라서 BOOST_PP_REPEAT_CHECK_
과 연결되면 BOOST_PP_REPEAT_CHECK_BOOST_PP_REPEAT_1
으로 확장되며 0
으로 확장됩니다. 그러나 BOOST_PP_REPEAT_1
이 재귀 적으로 호출되지 않으면 BOOST_PP_NIL
으로 확장되고 BOOST_PP_REPEAT_CHECK_
과 연결되어 1
을 생성합니다.
따라서 BOOST_PP_REPEAT_n
매크로 중 하나가 확장 될 수 있는지 검색하기 위해 조건부가 설정됩니다. 그런 다음 BOOST_PP_AUTO_REC
은 확장 할 수있는 첫 번째 항목을 찾기 위해 이진 검색을 수행합니다. BOOST_PP_REPEAT
의 경우에는 4 개의 재귀 수준 만 검색하지만 BOOST_PP_WHILE
과 같은 다른 매크로는 256 자까지 재귀 깊이가 있습니다.
폴 푸르트 답변 해 주셔서 감사합니다. 이제는 저에게 분명합니다. 불행히도 아직 완전히. 어쩌면 나는 강철을 놓칠지도 모른다. 예를 들어 : 부스트 선언에서 우리가 #이는 가 BOOST_PP_CAT (BOOST_PP_ENUM_이 BOOST_PP_AUTO_REC (BOOST_PP_REPEAT_P, 4))은 항상 확장 그럼, 왜 단지를 BOOST_PP_ENUM_1하는 BOOST_PP_ENUM BOOST_PP_CAT (4) BOOST_PP_ENUM_, BOOST_PP_AUTO_REC (BOOST_PP_REPEAT_P) 정의 으로 정의하지 마라. #define BOOST_PP_ENUM BOOST_PP_ENUM_1 –
'BOOST_PP_REPEAT' 매크로에서'BOOST_PP_ENUM' 매크로가 호출되면, 여기의 예제처럼'BOOST_PP_ENUM_1' 매크로로 확장되지 않습니다 : http://www.boost.org/doc/libs /1_61_0/libs/preprocessor/doc/AppendixA-PreprocessorMetaprogramming.html#horizontal-repetition –
Paul Fultz에게 다시 한번 감사드립니다. 당신의 설명 때문에 모든 것을 완전히 이해했습니다. –