Können rekursive Makros existieren?
Während Makros fehlen Obwohl C/C inhärente rekursive Fähigkeiten bietet, gibt es einen Weg, rekursives Verhalten zu erreichen. Mit einer Kombination aus verzögerten Ausdrücken und Indirektion können ausgefeilte Makros erstellt werden, die eine Rekursion simulieren.
Wie es funktioniert
Um ein rekursives Makro zu erstellen, müssen wir ein Multi verwenden -Schritt-Prozess:
Beispiel: Rekursives Wiederholungsmakro
Hier ist eine Illustration eines rekursiven Wiederholungsmakros:
#define REPEAT(count, macro, ...) \ WHEN(count) \ ( \ OBSTRUCT(REPEAT_INDIRECT) () \ ( \ DEC(count), macro, __VA_ARGS__ \ ) \ OBSTRUCT(macro) \ ( \ DEC(count), __VA_ARGS__ \ ) \ )
Dieses Makro kann wie folgt aufgerufen werden:
EVAL(REPEAT(8, M, ~)) // Outputs: 0 1 2 3 4 5 6 7
Beispielausführungsproblem
Von Ihnen bereitgestellt Code:
# define pr(n) ((n==1)? 1 : pr(n-1)) void main () { int a=5; cout<<"result: "<< pr(5) <<endl; getch(); }
wird aufgrund eines rekursiven Makroproblems nicht ausgeführt. Das PR-Makro basiert ausschließlich auf Rekursion, was zu einer unendlichen Erweiterung führt.
Lösung
Um dieses Problem zu beheben, können Sie die folgende nicht-rekursive Version des Makros verwenden:
#define fact(n) ((n == 1)? 1 : n * fact(n - 1))
Das obige ist der detaillierte Inhalt vonKönnen rekursive Makros in C/C implementiert werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!