In C ++ kann man eine der folgenden Aussagen schreiben:
%Vor%oder etwas wie
%Vor% Letzteres kann verwendet werden, um eine Compiler-Warnung "Eine Variable wird initialisiert, aber nicht referenziert" (C4189 in VC ++) zu unterdrücken, wenn ein Makro, das in einer Konfiguration in eine leere Zeichenfolge expandiert wird, später mit der result
-Variable verwendet wird. So:
Was bedeuten solche Aussagen? Wie können sie verwendet werden, außer für Compiler Warning Suppression?
Diese Anweisungen (Ausdrucksanweisungen in der C ++ - Grammatik genannt) sind gültig, weil sie Ausdrücke sind.
Ausdrücke sind alle Konstrukte, die eine Art von Wert berechnen, z. B.
Ich denke, um die Grammatik einfach zu halten, haben sie sich entschieden, nicht zwischen jenen Ausdrücken zu unterscheiden, die tatsächlich einen Nebeneffekt haben (wie der Funktionsaufruf oder die Zuweisung) und denen, die das nicht tun.
Diese Art von Aussagen ist eine logische Erweiterung dessen, wie andere Teile der Sprache funktionieren. Betrachten Sie eine Funktion, die einen Wert zurückgibt, zum Beispiel int foo()
, der auch einige Nebenwirkungen hat. Manchmal möchten Sie nur, dass diese Nebenwirkungen auftreten, also schreiben Sie foo();
als Anweisung.
Nun, während dies nicht genau wie 10;
aussieht, wird der Funktionsaufruf früher oder später zu einem int ausgewertet, und nichts passiert mit diesem int, genau wie mit 10;
.
Ein weiteres Beispiel für dasselbe Problem ist, dass a = b = 10;
verwendet werden kann, dh b = 10
muss auf 10
ausgewertet werden. Daher können Sie keine Zuweisung durchführen, ohne einen Wert zu erzeugen, der unterdrückt werden muss.
Solche Werte als Anweisungen schreiben zu können, ist nur ein logischer Weg, um die Sprache zu erstellen, aber für die Fälle, die Sie präsentieren, kann es sogar eine gute Idee sein, eine Compilerwarnung dafür zu geben.
Es sei denn, Sie verwenden es, um Compiler-Warnungen zu unterdrücken;)
Eine solche Anweisung tut nichts und wird wahrscheinlich von jedem vernünftigen Compiler optimiert.
Es kann nützlich sein, die Warnung unbenutzte Variable loszuwerden, aber bei einigen Compilern können Sie statt dessen eine Anweisung erhalten, die keine Auswirkung hat .
Sie haben keinen praktischen Nutzen jenseits der Unterdrückung von Compiler-Warnungen, und im Allgemeinen wird der Compiler eine solche Konstanten-Wert-Anweisung, die keine Nebenwirkung hat, herausnehmen.
Sie sind Ausdrücke, die ausgewertet werden, vorausgesetzt, der Compiler optimiert sie nicht. Was "Bedeutung" angeht, ich bin mir nicht sicher, was du damit meinst!
In C und C ++ wird eine Anweisung ausgewertet, die nur ein Ausdruck ist.
Die Tatsache, dass der Ausdruck möglicherweise nutzlos ist, ist harmlos und führt bei aktiviertem Optimierer dazu, dass überhaupt kein Code generiert wird. Wie Sie jedoch festgestellt haben, zählt es normalerweise als Verwendung einer Variablen.
Beachten Sie, dass Anweisungen, die nur einen Ausdruck enthalten, ziemlich häufig sind. Ein einfacher Funktionsaufruf ist beispielsweise eins. In printf("hello, world.\n");
wird der Rückgabewert von printf()
ignoriert, aber die Funktion wird noch aufgerufen und ihr beabsichtigter Effekt (Textausgabe) passiert.
Außerdem ist eine Variablenzuweisung x = 3;
auch eine Anweisung, die aus einem einfachen Ausdruck besteht, da die Zuweisung ein Operator ist und zusätzlich zu seinem Nebeneffekt der Änderung des lvalue einen Wert zurückgibt.
Obwohl legal, halte ich diese Aussagen für unübersichtlich und sollte vermieden werden, auch wenn Warnungen unterdrückt werden. Für mich ist es vernünftiger, die Warnung mit etwas wie diesem zu unterdrücken:
%Vor%Ich stimme Magnus 'Antwort zu. Es gibt jedoch eine Sache, die mich verwirrt: Warum benutzt du diesen Unsinn?
%Vor% um Compilerwarnungen los zu werden? Meiner bescheidenen Meinung nach ist es viel schlimmer, in einer solchen Situation keine Warnung zu haben. Die Variable result
wird immer noch nicht verwendet - Sie haben gerade "den Dreck unter den Teppich gekehrt". Dieser "lone variable" -Ansatz sieht so aus, als ob etwas fehlt ( Habe ich versehentlich etwas gelöscht? ). Warum benutzt du nicht
an erster Stelle? Es versichert jedem, der Ihren Code lesen würde, dass Ihnen das Ergebnis nicht wichtig ist. Es ist sehr schwierig, dies "versehentlich" zu stellen. Offensichtlich erzeugt dies keine Compiler-Warnungen.
Tags und Links c++ compiler-construction