>백엔드 개발 >C++ >C/C 전처리에서 재귀 매크로를 만들 수 있습니까?

C/C 전처리에서 재귀 매크로를 만들 수 있습니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-09 11:47:16177검색

Can We Create Recursive Macros in C/C   Preprocessing?

재귀 매크로를 사용할 수 있나요?

매크로가 직접 재귀적으로 확장되지는 않지만 유사한 기능을 달성할 수 있는 영리한 기술이 있습니다.

해결 방법 재귀 매크로

전처리기가 다음을 방지하기 위해 지연 표현식과 간접 사용을 사용할 수 있습니다. 확장 중에 매크로를 비활성화합니다. 다음은 재귀 pr 매크로 생성의 예입니다.

#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) -> ((5==1)? 1 : pr_id()(4))
EXPAND(pr(5)) -> ((5==1)? 1 : ((4==1)? 1 : pr_id()(3)))

재귀 반복 매크로의 예

이러한 기술을 사용하면, 재귀적인 REPEAT를 만들 수 있습니다 매크로:

#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

적용성 및 제한 사항

이러한 해결 방법을 사용하면 재귀 매크로가 가능하지만 복잡할 수 있으며 모든 경우에 작동하지 않을 수 있다는 점에 유의하는 것이 중요합니다. 재귀적인 매크로 사용에 주의해서 접근하고 적절한 경우 함수나 템플릿 메타프로그래밍과 같은 대안을 고려하는 것이 좋습니다.

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

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