C/C의 재귀 매크로: 신화인가 현실인가?
C/C에 직접 재귀 매크로가 없음에도 불구하고 영리한 해결 방법이 존재합니다. 재귀적인 느낌을 얻기 위해
지연 표현식과 간접을 사용한 재귀 매크로 에뮬레이션
한 가지 접근 방식에는 지연 표현식과 간접 사용이 포함됩니다. DEFER 및 EMPTY 매크로를 사용하면 매크로 평가를 연기하고 전처리기에 의해 파란색으로 표시되는 것을 방지할 수 있습니다. 이는 재귀 확장 제한을 우회합니다.
예를 들어 다음 매크로를 고려해보세요.
#define pr_id() pr #define pr(n) ((n==1)? 1 : DEFER(pr_id)()(n-1))
이 매크로를 활용하면 로터리 방식으로 pr(n)을 재귀적으로 호출하는 기능을 얻을 수 있습니다. . 그러나 이 기술은 완전한 확장을 위해 다중 전처리기 스캔이 필요합니다.
표현식 평가를 통한 재귀 매크로
또 다른 방법은 EVAL1과 같은 일련의 표현식 평가 매크로를 활용하는 것입니다. EVAL5, 재귀 동작을 시뮬레이션합니다.
예를 들어 재귀 반복 매크로를 정의하기 위해 다음을 활용할 수 있습니다. 구문:
#define REPEAT(count, macro, ...) \ WHEN(count) \ ( \ OBSTRUCT(REPEAT_INDIRECT) () \ ( \ DEC(count), macro, __VA_ARGS__ \ ) \ OBSTRUCT(macro) \ ( \ DEC(count), __VA_ARGS__ \ ) \ )
다중 확장을 적용하면 다음 코드에서 볼 수 있듯이 재귀와 유사한 동작을 얻을 수 있습니다.
EVAL(REPEAT(8, M, ~)) // Output: 0 1 2 3 4 5 6 7
코드 실행 문제
귀하의 질문에 언급된 코드는 cout 개체의 부적절한 사용으로 인해 실행되지 않습니다. 올바른 구문은 다음과 같습니다.
cout << "result: " << pr(5) << endl;
< > <<가 있는 기호 C에서 적절한 출력을 활성화하려면
위 내용은 C/C에서 재귀 매크로를 구현할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!