Ich bin kürzlich auf diesen Code gestoßen, der mir nicht legal erscheint (aber gcc kompiliert ihn). Ich kümmere mich nicht so sehr um die Konstruktion, als einen Namen dafür zu haben:
%Vor%Offenbar wird der Wert der letzten Anweisung als "Wert" des durch den Namensraum begrenzten Ausdrucks zurückgegeben.
Edit: Danke für die Antworten Jungs. Es stellt sich heraus, dass es sich um eine Erweiterung von normalem C namens Statement Expressions handelt.
Es ist kein Namespace , es ist ein Makro , das maximal zwei Werte zurückgibt.
\
am Ende der Anweisungen wird zum Anhängen verwendet mehrere Anweisungen und erstellen Sie ein mehrzeiliges Makro.
Der Code ist kein Standard-C ++, aber er kompiliert in gcc, weil er als gcc Compiler-Erweiterung .
Gut gelesen:
Statement-Ausdrücke:
Eine zusammengesetzte Anweisung ist eine Folge von Anweisungen, die durch geschweifte Klammern eingeschlossen sind. In GNU C kann eine zusammengesetzte Anweisung in Klammern als Ausdruck in einem sogenannten Statement expression
erscheinen.
Der Wert eines Anweisungsausdrucks ist der Wert des letzten einfachen Ausdrucks, der im gesamten Konstrukt angezeigt wird. Wenn die letzte Anweisung kein Ausdruck ist, hat das Konstrukt den Typ void und hat keinen Wert.
Hinweis: Dieser Auszug stammt aus IBM XL C / C ++ v7.0 Dokumentation.
Dies wird als Anweisungsausdruck bezeichnet und ist ein nicht standardmäßiger Erweiterung von GCC. Sie können eine zusammengesetzte Anweisung als Ausdruck mit einem Wert verwenden, der durch den letzten Ausdruck in der zusammengesetzten Anweisung angegeben wird.
Es wird hier verwendet, um das Problem zu vermeiden, dass funktionsähnliche Makros ihre Argumente mehrfach auswerten können, was zu unerwartetem Verhalten führt, wenn diese Bewertungen Nebenwirkungen haben. Das Makro wird sorgfältig geschrieben, um a
und b
genau einmal auszuwerten.
In C ++ sollten Sie niemals so etwas machen - verwenden Sie stattdessen Funktionsvorlagen:
%Vor% Zunächst ist es nicht Standard C ++, weil typeof
eine Erweiterung von C ++ ist, von GCC. Es gibt eine andere Erweiterung namens Statement Extension, die im Code verwendet wird.
Kompilieren Sie Ihren Code mit -pedantic
Option, es wird nicht kompiliert.
Was die Frage angeht, ist es kein Namespace. Es ist nur ein Makro, das Ihnen maximal zwei Werte gibt.
Die {} -Operatoren sind in diesem Zusammenhang ein "anonymer Bereichsoperator" (auch bekannt als "lexikalische Einschließung", "Form") und verschiedene andere Dinge. Sie werden verwendet, um ein bisschen wie ein Namensraum zu begrenzen Bereich von _a und _b innerhalb der geschweiften Klammern, damit sie nicht in Konflikt mit anderen Vars geraten, die Sie möglicherweise mit denselben Namen haben. "auto" vars, die innerhalb der {geschweiften Klammern} definiert sind, werden "zerstört", nachdem die schließende geschweifte Klammer erreicht wurde Bei einer nicht-lokalen Übertragung, wie zB "return" oder "longjmp", kann man "goto" jedoch nicht zuverlässig verwenden, um sie anzusprechen.
Sie sind wahrscheinlich nur daran gewöhnt, sie nach "if", "do", "while" und "for" zu sehen, aber denken Sie daran, um mehrere Anweisungen in einem "Slot" zu bündeln, "So wie Sie mehrere Anweisungen als" then "oder" else "-Klausel eines" if "ausführen würden (wobei Sie die Klammern auslassen, haben Sie nur eine Anweisung" slot ")
Wie Mike Seymour schon sagte, handelt es sich bei der Operation ({}) um eine nicht standardisierte GCC-Erweiterung, die den Wert des letzten darin evaluierten Elements zurückgibt. Es ist dem allgemeinen Bereichsoperator sehr ähnlich, mit Ausnahme der inhärenten Rückgabe am Ende.
Dies ist ein Makro, genau wie jedes andere #DEFINE. Im Wesentlichen ersetzt der Compiler MAX (a, b) durch den darin definierten Code. Dies wird den maximalen Wert zurückgeben.
Tags und Links c c++ gcc terminology