Heim > Backend-Entwicklung > C++ > Können rekursive Makros in C/C erreicht werden?

Können rekursive Makros in C/C erreicht werden?

Linda Hamilton
Freigeben: 2024-12-16 13:55:16
Original
929 Leute haben es durchsucht

Can Recursive Macros Be Achieved in C/C  ?

Rekursive Makros in C/C: Mythos oder Realität?

Obwohl es in C/C keine direkten rekursiven Makros gibt, gibt es clevere Problemumgehungen um einen Anschein einer rekursiven Funktionalität zu erreichen.

Rekursives Makro Emulation mit verzögerten Ausdrücken und Indirektion

Ein Ansatz besteht darin, verzögerte Ausdrücke und Indirektion zu verwenden. Durch die Verwendung der DEFER- und EMPTY-Makros können wir die Auswertung unseres Makros verzögern und verhindern, dass es vom Präprozessor blau dargestellt wird. Dadurch wird die Einschränkung der rekursiven Erweiterung umgangen.

Betrachten Sie beispielsweise das folgende Makro:

#define pr_id() pr
#define pr(n) ((n==1)? 1 : DEFER(pr_id)()(n-1))
Nach dem Login kopieren

Durch die Nutzung dieses Makros erhalten wir die Möglichkeit, pr(n) auf Umwegen rekursiv aufzurufen . Diese Technik erfordert jedoch mehrere Präprozessor-Scans für eine vollständige Erweiterung.

Rekursives Makro über Ausdrucksauswertung

Eine andere Methode beinhaltet die Verwendung einer Reihe von Ausdrucksauswertungsmakros, wie z. B. EVAL1 bis EVAL5, um rekursives Verhalten zu simulieren.

Um beispielsweise ein rekursives Wiederholungsmakro zu definieren, können wir Folgendes verwenden Syntax:

#define REPEAT(count, macro, ...) \
    WHEN(count) \
    ( \
        OBSTRUCT(REPEAT_INDIRECT) () \
        ( \
            DEC(count), macro, __VA_ARGS__ \
        ) \
        OBSTRUCT(macro) \
        ( \
            DEC(count), __VA_ARGS__ \
        ) \
    )
Nach dem Login kopieren

Durch die Anwendung mehrerer Erweiterungen können wir rekursives Verhalten erreichen, wie der folgende Code zeigt:

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

Codeausführungsproblem

Der in Ihrer Frage erwähnte Code wird aufgrund der unsachgemäßen Verwendung des Cout-Objekts nicht ausgeführt. Die korrekte Syntax sollte wie folgt lauten:

cout << "result: " << pr(5) << endl;
Nach dem Login kopieren

Ersetzen Sie < und > Symbole mit << um eine ordnungsgemäße Ausgabe in C zu ermöglichen.

Das obige ist der detaillierte Inhalt vonKönnen rekursive Makros in C/C erreicht 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