Dies wird als Anweisungsausdruck bezeichnet und erzeugt ein "Lambda" (oder eine verschachtelte Funktion) ) und gibt einen Zeiger darauf zurück. Es ist GNU C-spezifisch.
Das Makro wird erweitert zu:
int (*max)(int, int) = ({ int _ (int x, int y) { return x > y ? x : y; } _; })
Das _
am Ende ist wie ein return
.
Der Unterstrich ist eigentlich der Name der Funktion, die erstellt und "zurückgegeben" wird. Es wird verwendet, weil es ein selten verwendeter Bezeichner ist (aus gutem Grund; _
möglicherweise der am wenigsten beschreibende Bezeichner).
Der Grund, warum der Anweisungsausdruck verwendet wird, _
wird nicht definiert, nachdem der Gültigkeitsbereich des Anweisungsausdrucks beendet wurde.
Gehen Sie also das Makro durch:
#define lambda(ret_type, _body) ({ ret_type _ _body _; })
ret_type
ist der Rückgabetyp des "Lambda". _
ist der Name der darin verwendeten Funktion, da es sich um einen ungewöhnlichen Bezeichnernamen handelt. _body
besteht aus den Argumenten und dem Hauptteil der Funktion. Das nachfolgende _
"gibt" das "Lambda" zurück.
Dieser Code befindet sich unter Let's Destroy C (ein geeigneter Name). Du solltest es nicht benutzen. Ihr Code funktioniert nur auf Compilern, die GNU C-Erweiterungen unterstützen. Schreiben Sie stattdessen einfach eine Funktion oder ein Makro.
Wenn Sie solche Konstrukte häufig verwenden oder mehr Funktionen wünschen, empfehle ich die Verwendung von C ++. Mit C ++ können Sie etwas Ähnliches tun und über tragbaren Code verfügen.
gcc -E
) zu erweitern, um zu sehen, was es tut?