Heim >Backend-Entwicklung >C++ >Können wir in der C/C-Vorverarbeitung rekursive Makros erstellen?

Können wir in der C/C-Vorverarbeitung rekursive Makros erstellen?

Barbara Streisand
Barbara StreisandOriginal
2024-12-09 11:47:16179Durchsuche

Can We Create Recursive Macros in C/C   Preprocessing?

Können wir rekursive Makros haben?

Während Makros nicht direkt rekursiv erweitert werden, gibt es clevere Techniken, um eine ähnliche Funktionalität zu erreichen.

Workaround für Rekursive Makros

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)))

Beispiel für ein rekursives Wiederholungsmakro

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

Anwendbarkeit und Einschränkungen

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!

Stellungnahme:
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