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))
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__ \ ) \ )
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
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;
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!