>백엔드 개발 >C++ >C/C 매크로로 재귀를 어떻게 에뮬레이션할 수 있나요?

C/C 매크로로 재귀를 어떻게 에뮬레이션할 수 있나요?

Linda Hamilton
Linda Hamilton원래의
2024-12-07 08:53:11990검색

How Can Recursion Be Emulated with C/C   Macros?

C/C의 재귀 매크로

C/C의 매크로는 직접 재귀를 지원하지 않습니다. 그러나 전처리 기술과 간접법의 조합을 통해 재귀를 에뮬레이션하는 것은 가능합니다.

재귀형 매크로의 예

다음 매크로는 지연 표현식을 사용하여 재귀를 시뮬레이션합니다. 및 간접:

#define EMPTY(...)
#define DEFER(...) __VA_ARGS__ EMPTY()
#define OBSTRUCT(...) __VA_ARGS__ DEFER(EMPTY)()
#define EXPAND(...) __VA_ARGS__

#define pr_id() pr
#define pr(n) ((n == 1) ? 1 : DEFER(pr_id)()(n - 1))

실행 프로세스

pr(5)가 발생하면 다음 단계가 발생합니다.

  1. pr(5)는 ((5 == 1) ? 1 : DEFER(로 확장됩니다. pr_id)()(5 - 1)).
  2. 전처리기가 pr(5)를 파란색으로 칠합니다(비활성화) context), 더 이상 확장되는 것을 방지합니다.
  3. DEFER(pr_id)()(5 - 1)은 OBSTRUCT(pr_id)()(5 - 1)이 되고 pr_id()는 파란색으로 칠해집니다.
  4. EXPAND(pr(5))는 ((5 == 1) ? 1 : ((5 - 1 == 1) ? 1 : DEFER(pr_id)()(5 - 1 - 1)))
  5. 재귀를 완료하려면 추가 확장이 필요합니다.

재귀 반복 매크로

재귀형 매크로의 더 복잡한 예는 특정 작업을 실행하는 반복 매크로입니다. 코드를 지정된 횟수만큼 차단합니다.

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

#define M(i, _) i

이 매크로는 다음과 같이 사용할 수 있습니다.

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

제한 사항

재귀를 에뮬레이션하는 동안 매크로를 통해 수행하는 것은 가능하지만 잠재적인 성능 영향 및 코드 가독성 문제로 인해 일반적으로 나쁜 습관으로 간주됩니다. Modern C는 람다 표현식, 템플릿 메타프로그래밍과 같은 재귀를 위한 대체 메커니즘을 제공합니다.

위 내용은 C/C 매크로로 재귀를 어떻게 에뮬레이션할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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