Heim > Backend-Entwicklung > C++ > Wie kann Rekursion mit C/C-Makros emuliert werden?

Wie kann Rekursion mit C/C-Makros emuliert werden?

Linda Hamilton
Freigeben: 2024-12-07 08:53:11
Original
999 Leute haben es durchsucht

How Can Recursion Be Emulated with C/C   Macros?

Rekursive Makros in C/C

Makros in C/C unterstützen keine direkte Rekursion. Es ist jedoch möglich, die Rekursion durch eine Kombination aus Vorverarbeitungstechniken und Indirektion zu emulieren.

Beispiel eines rekursiven Makros

Das folgende Makro simuliert die Rekursion mithilfe verzögerter Ausdrücke und Indirektion:

#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))
Nach dem Login kopieren

Ausführung Prozess

Wenn pr(5) angetroffen wird, laufen die folgenden Schritte ab:

  1. pr(5) wird zu ((5 == 1) ? 1 : DEFER( pr_id)()(5 - 1)).
  2. Der Präprozessor malt pr(5) blau (deaktiviert den Kontext) und verhindert so dessen Erweiterung weiter.
  3. DEFER(pr_id)()(5 - 1) wird zu OBSTRUCT(pr_id)()(5 - 1) und pr_id () wird blau gestrichen.
  4. EXPAND(pr(5 )) erweitert sich zu ((5 == 1) ? 1 : ((5 - 1 == 1) ? 1 : DEFER(pr_id)()(5 - 1 - 1)))
  5. Zusätzliche Erweiterungen sind erforderlich, um die Rekursion abzuschließen.

Rekursives Wiederholungsmakro

Ein komplexeres Beispiel für ein rekursivartiges Makro ist ein Wiederholungsmakro, das einen bestimmten Codeblock in einer bestimmten Anzahl ausführt mal:

#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
Nach dem Login kopieren

Dieses Makro kann wie folgt verwendet werden:

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

Einschränkungen

Während die Emulation der Rekursion durch Makros möglich ist, ist es möglich wird im Allgemeinen aufgrund möglicher Auswirkungen auf die Leistung und Problemen mit der Lesbarkeit des Codes als schlechte Praxis angesehen. Modernes C bietet alternative Mechanismen für die Rekursion, wie zum Beispiel Lambda-Ausdrücke und Template-Metaprogrammierung.

Das obige ist der detaillierte Inhalt vonWie kann Rekursion mit C/C-Makros emuliert werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage