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

C/C에서 재귀 매크로를 구현할 수 있습니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-06 09:05:12312검색

Can Recursive Macros Be Implemented in C/C  ?

C/C에서 재귀 매크로 탐색: 확장의 예술

재귀 매크로가 존재할 수 있습니까?

매크로에는 부족하지만 C/C에는 고유한 재귀 기능이 있으므로 재귀와 유사한 동작을 달성할 수 있는 경로가 있습니다. 지연된 표현식과 간접의 조합을 사용하면 재귀를 시뮬레이션하는 정교한 매크로를 만들 수 있습니다.

작동 방식

재귀 매크로를 만들려면 다중 매크로를 수용해야 합니다. -단계 프로세스:

  1. 방해 자체 확장: 비활성화 컨텍스트를 생성하여 매크로가 확장을 중단하는 것을 방지합니다.
  2. 간접: 확장을 이후 단계로 연기하려면 간접을 사용합니다.
  3. 확장: 여러 스캔을 적용하여 확장을 완료하세요. process.

예: 재귀 반복 매크로

다음은 재귀 반복 매크로의 그림입니다.

#define REPEAT(count, macro, ...) \
    WHEN(count) \
    ( \
        OBSTRUCT(REPEAT_INDIRECT) () \
        ( \
            DEC(count), macro, __VA_ARGS__ \
        ) \
        OBSTRUCT(macro) \
        ( \
            DEC(count), __VA_ARGS__ \
        ) \
    )

이 매크로는 다음과 같습니다. 다음과 같이 호출됨 이:

EVAL(REPEAT(8, M, ~)) // Outputs: 0 1 2 3 4 5 6 7

샘플 실행 문제

제공된 코드:

# define pr(n) ((n==1)? 1 : pr(n-1))
void main ()
{
    int a=5;
    cout<<"result: "<< pr(5) <<endl;
    getch();
}

재귀적인 매크로 문제로 인해 실행되지 않습니다. pr 매크로는 재귀에만 의존하므로 무한 확장이 가능합니다.

해결책

이 문제를 해결하려면 다음과 같은 비재귀 버전의 매크로를 사용할 수 있습니다.

#define fact(n) ((n == 1)? 1 : n * fact(n - 1))

위 내용은 C/C에서 재귀 매크로를 구현할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.