int fn();
void whatever()
{
(void) fn();
}
Gibt es einen Grund, einen nicht verwendeten Rückgabewert für ungültig zu erklären, oder habe ich Recht, wenn ich denke, dass dies reine Zeitverschwendung ist?
Nachverfolgen:
Nun, das scheint ziemlich umfassend zu sein. Ich nehme an, es ist besser als einen nicht verwendeten Rückgabewert zu kommentieren, da selbstdokumentierender Code besser ist als Kommentare. Persönlich werde ich diese Warnungen ausschalten, da es unnötiger Lärm ist.
Ich werde meine Worte essen, wenn ein Fehler dadurch entkommt ...
Bei der Arbeit verwenden wir dies, um zu bestätigen, dass die Funktion einen Rückgabewert hat, aber der Entwickler hat behauptet, dass es sicher ist, ihn zu ignorieren. Da Sie die Frage als C ++ markiert haben, sollten Sie static_cast verwenden :
Für den Compiler hat das Umwandeln des Rückgabewerts in void wenig Bedeutung.
quelle
Der wahre Grund dafür liegt in einem Tool, das für C-Code verwendet wird und Lint heißt .
Es analysiert Code auf mögliche Probleme und gibt Warnungen und Vorschläge aus. Wenn eine Funktion einen Wert zurückgibt, der dann nicht überprüft wurde, wird
lint
gewarnt, falls dies versehentlich geschieht. Umlint
diese Warnung zum Schweigen zu bringen , rufen Sie an(void)
.quelle
Casting to
void
wird verwendet, um Compiler-Warnungen für nicht verwendete Variablen und nicht gespeicherte Rückgabewerte oder Ausdrücke zu unterdrücken.Der Standard (2003) sagt in §5.2.9 / 4,
So können Sie schreiben:
Alle Formulare sind gültig. Normalerweise mache ich es kürzer als:
Es ist auch okay.
quelle
Seit c ++ 17 haben wir das
[[maybe_unused]]
Attribut, das anstelle dervoid
Besetzung verwendet werden kann.quelle
nodiscard
was von Interesse sein könnte: stackoverflow.com/a/61675726/895245 Ich denke auch, dass Sie[[maybe_unused]]
den Aufruf anscheinend nicht direkt anwenden können, sondern nur auf eine Dummy-Variable, die die Rückgabe des Aufrufs akzeptiert? Wenn das stimmt, ist es ein bisschen wackelig.Cast to void ist kostenlos. Es sind nur Informationen für den Compiler, wie er damit umgehen soll.
quelle
(void)
kostet mich Zeit und Energie und lässt mich fragen, ob der Autor wusste, wie Ausdrücke funktionieren.Für die Funktionalität Ihres Programms ist Casting to void bedeutungslos. Ich würde auch argumentieren, dass Sie es nicht verwenden sollten, um der Person, die den Code liest, etwas zu signalisieren, wie in der Antwort von David vorgeschlagen. Wenn Sie etwas über Ihre Absichten mitteilen möchten, ist es besser, einen Kommentar zu verwenden. Das Hinzufügen einer solchen Besetzung sieht nur seltsam aus und wirft Fragen nach dem möglichen Grund auf. Nur meine Meinung...
quelle
For the functionality of you program casting to void is meaningless
Für die Selbstdokumentation und die Anzahl der Warnungen beim Kompilieren ist dies wirklich nicht der Fall .you should not use it to signal something to the person that is reading the code [...] it is better to use a comment.
Der beste Kommentar ist kein Kommentar , wenn sich der Code selbst erklärt. Auch hier bleibt ein gültiger Warn-Compiler zufrieden.Wenn Sie überprüfen, ob Ihr Code den MISTA-Standards (oder anderen) entspricht, können Sie mit automatischen Tools wie LDRA keine Funktion mit einem Rückgabetyp aufrufen, ohne dass ein Wert zurückgegeben wird, es sei denn, Sie geben den zurückgegebenen Wert explizit in (void) um.
quelle
C ++ 17
[[nodiscard]]
C ++ 17 standardisierte das "Rückgabewert ignoriertes Geschäft" mit einem Attribut.
Daher hoffe ich, dass konforme Implementierungen immer nur dann warnen, wenn dies
nodiscard
angegeben ist, und niemals anders warnen.Beispiel:
main.cpp
kompilieren:
Ergebnis:
Folgendes vermeidet die Warnung:
Ich konnte nicht
maybe_unused
direkt auf demf()
Anruf verwenden:gibt:
Die
(void)
Besetzungsarbeit scheint nicht obligatorisch zu sein, wird jedoch im Standard "empfohlen ": Wie kann ich absichtlich einen Rückgabewert verwerfen?Wie aus der Warnmeldung hervorgeht, besteht eine "Lösung" der Warnung darin, Folgendes hinzuzufügen
-Wno-unused-result
:obwohl ich natürlich nicht empfehlen würde, Warnungen global wie diese zu ignorieren.
C ++ 20 können Sie auch einen Grund, die hinzuzufügen ,
nodiscard
wie in[[nodiscard("reason")]]
wie erwähnt unter: https://en.cppreference.com/w/cpp/language/attributes/nodiscardGCC-
warn_unused_result
AttributVor der Standardisierung von
[[nodiscard]]
und für C, bevor sie sich endgültig für die Standardisierung von Attributen entscheiden, hat GCC genau dieselbe Funktionalität implementiert mitwarn_unused_result
:was gibt:
Es sollte dann darauf hingewiesen, dass seit ANSI C keinen Standard hat für diesen, ANSI C nicht angibt , welche C - Standardbibliothek Funktionen das Attribut haben oder nicht , und deshalb haben Implementierungen ihre eigenen Entscheidungen darüber , was sollte oder nicht markiert werden
warn_unuesd_result
, die Aus diesem Grund müssten Sie im Allgemeinen die(void)
Umwandlung verwenden, um Rückgaben von Aufrufen von Standardbibliotheksfunktionen zu ignorieren und Warnungen in jeder Implementierung vollständig zu vermeiden.Getestet in GCC 9.2.1, Ubuntu 19.10.
quelle