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_typeist der Rückgabetyp des "Lambda". _ist der Name der darin verwendeten Funktion, da es sich um einen ungewöhnlichen Bezeichnernamen handelt. _bodybesteht 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?