Betrachten Sie das folgende main()
:
Beim Kompilieren mit cc -Wall -Wextra
werden Warnungen mit dem Hinweis "unused parameter" erzeugt.
Wenn ich keinen Parameter in einer Funktion verwenden muss (z. B. in einer Signal-Handler-Funktion , die Nein macht Verwendung seines int
-Parameters), bin ich es gewohnt, Folgendes zu tun:
(Für diesen speziellen
main()
sehe ich manchmal andere Leute:argv = argv - argc + argc
)
Aber Was macht (void)var
eigentlich ? ?
Ich verstehe, dass (void)
eine Besetzung ist, also schätze ich, dass ich die Variable wegwerfe? Was macht die var;
-Zeile (ohne die Besetzung)? Ist es eine leere Aufgabe, ein leerer Ausdruck?
Ich würde gerne verstehen, was eigentlich los ist.
Es ist nur eine Möglichkeit, einen 'harmlosen' Verweis auf die Variable zu erstellen. Der Compiler beschwert sich nicht über eine unbenutzte Variable, weil Sie den Wert referenziert haben, und er beschwert sich nicht, dass Sie nichts mit dem Wert des Ausdrucks var
getan haben, weil Sie ihn explizit in void (nichts) umgewandelt haben , um anzuzeigen, dass Sie den Wert nicht interessiert haben.
Ich habe diese Verwendung von Variablen noch nicht gesehen (weil der Compiler, den ich verwende, normalerweise nicht über nicht verwendete Funktionsargumente klagen würde), aber ich sehe, dass dies häufig verwendet wird, um dem Compiler anzuzeigen
dass Sie den Rückgabewert einer Funktion nicht wirklich interessieren. printf(),
gibt beispielsweise einen Wert zurück, aber 99% der C-Programme wissen nicht, was sie zurückgibt. Um zu bewirken, dass einige zwingende Compiler oder lint-Tools sich nicht über einen unbenutzten Rückgabewert beschweren, können Sie den Rückgabewert in void umwandeln, um anzuzeigen, dass Sie wissen, dass es da ist, und Sie sich explizit nicht darum kümmern.
Abgesehen davon, dass Sie dem Compiler Ihre Absicht mitteilen (dass Sie sich nicht um diesen Wert kümmern), tut nichts - es ist nur ein Hinweis für den Compiler.
Wenn ein Funktionsargument nicht verwendet wird, wie in Ihrem Programm, dann ist dies der idiomatische Weg, die Warnung eines unbenutzten Funktionsarguments, das von einigen Compilern ausgegeben wird, zu unterdrücken. Jeder ordentliche Compiler erzeugt keinen Code mit diesen Anweisungen.
Es wertet das Argument aus, tut aber nichts damit, was die meisten Compiler dazu veranlasst, keine Warnung auszugeben. Der (void)
-Cast wird verwendet, damit der Compiler keine weitere Warnung erzeugt, die darauf hinweist, dass der Wert nicht verwendet wird.
Eine weitere beliebte Möglichkeit, die Warnung zu unterdrücken, ist:
%Vor%Beachten Sie, dass ich einige Compiler kenne, die in Gegenwart von:
eine andere Warnung ausgeben %Vor%wie "Aussage ohne Wirkung".
Dies kann die Codeeffizienz erhöhen, da der Aufruf der Funktion die Register für Argumente nicht laden muss.
Wie andere Personen richtig angemerkt haben, unterdrückt es lediglich eine Compiler-Warnung über nicht verwendete Variable in Ihrem Code.
Btw, Win32 hat UNREFERENCED_PARAMETER
Makro definiert, um dieses Ziel zu erreichen.
Mein Vorschlag, so etwas in Ihrem Code zu machen: