10 Stimmen

Wie nennt man es, wenn ein Block einen Wert zurückgibt?

Ich bin kürzlich auf diesen Code gestoßen, der für mich nicht legal aussieht (aber gcc kompiliert ihn). Ich störe mich nicht so sehr an der Konstruktion, sondern möchte einen Namen dafür haben:

#define MAX(a,b) \
({ \
    typeof(a) _a = (a); \
    typeof(b) _b = (b); \
    (_a > _b) ? (_a) : (_b); \
})

Offenbar wird der Wert der letzten Anweisung als "Wert" des durch den Namensraum begrenzten Ausdrucks zurückgegeben.

Edit: Danke für die Antworten, Leute. Es stellt sich heraus, dass dies eine Erweiterung zu einfachem C namens Statement Expressions ist.

1voto

BRPocock Punkte 13307

Die {}-Operatoren sind in diesem Zusammenhang ein "anonymer Bereichsoperator" (auch bekannt als "lexikalische Einschließung", "Form" und verschiedene andere Dinge). Sie werden ähnlich wie ein Namensraum verwendet, um den Geltungsbereich von _a und _b auf die geschweiften Klammern zu beschränken, damit sie nicht mit anderen Variablen mit demselben Namen in Konflikt geraten. "auto"-Vars, die innerhalb der geschweiften Klammern definiert sind, werden "zerstört", wenn die schließende Klammer erreicht ist; oder bei einer nicht-lokalen Übergabe, wie einem "return" oder "longjmp". Sie können jedoch nicht zuverlässig "goto" verwenden, um sie aufzurufen.

Sie sind wahrscheinlich nur daran gewöhnt, sie nach "if"-, "do"-, "while"- und "for"-Operatoren zu sehen, aber betrachten Sie sie als eine Möglichkeit, mehrere Anweisungen in einem "Slot" zu bündeln, genauso wie Sie mehrere Anweisungen als "then"- oder "else"-Klausel eines "if" ausführen würden (wobei Sie, wenn Sie die geschweiften Klammern weglassen, nur einen Anweisungs-"Slot" haben)

Wie Mike Seymour feststellte, handelt es sich bei der ({})-Operation um eine nicht standardisierte GCC-Erweiterung, die den Wert des zuletzt ausgewerteten Elements zurückgibt. Sie ist dem allgemeinen Scoping-Operator sehr ähnlich, mit Ausnahme der inhärenten Rückgabe am Ende.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X