> 백엔드 개발 > C++ > C/C에서 재귀 매크로를 구현할 수 있나요?

C/C에서 재귀 매크로를 구현할 수 있나요?

Linda Hamilton
풀어 주다: 2024-12-16 13:55:16
원래의
929명이 탐색했습니다.

Can Recursive Macros Be Achieved in C/C  ?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿