Heim >Backend-Entwicklung >C++ >Können wir in der C/C-Vorverarbeitung rekursive Makros erstellen?
Während Makros nicht direkt rekursiv erweitert werden, gibt es clevere Techniken, um eine ähnliche Funktionalität zu erreichen.
Wir können verzögerte Ausdrücke und Indirektionen verwenden, um den Präprozessor daran zu hindern Deaktivieren des Makros während der Erweiterung. Hier ist ein Beispiel für die Erstellung eines rekursiven PR-Makros:
#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))
Dieses Makro wird wie folgt erweitert:
pr(5) -> ((5==1)? 1 : pr_id()(4)) EXPAND(pr(5)) -> ((5==1)? 1 : ((4==1)? 1 : pr_id()(3)))
Mit diesen Techniken Wir können ein rekursives REPEAT-Makro erstellen:
#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
Obwohl diese Problemumgehungen rekursive Makros ermöglichen, ist es wichtig zu beachten, dass sie komplex sein können und möglicherweise nicht in allen Fällen funktionieren. Es wird empfohlen, die Verwendung rekursiver Makros mit Vorsicht anzugehen und gegebenenfalls Alternativen wie Funktionen oder Vorlagen-Metaprogrammierung in Betracht zu ziehen.
Das obige ist der detaillierte Inhalt vonKönnen wir in der C/C-Vorverarbeitung rekursive Makros erstellen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!