Was bedeutet casting zu `void` wirklich tun?
Eine oft verwendete Aussage wie (void)x;
ermöglicht das unterdrücken von Warnungen über nicht verwendete variable x
. Aber wenn ich versuche zu kompilieren, den folgenden, bekomme ich einige Ergebnisse, die ich nicht ganz verstehe:
int main()
{
int x;
(short)x;
(void)x;
(int)x;
}
Kompilieren mit g++, bekomme ich folgende Warnungen:
$ g++ test.cpp -Wall -Wextra -o test
test.cpp: In function ‘int main()’:
test.cpp:4:13: warning: statement has no effect [-Wunused-value]
(short)x;
^
test.cpp:6:11: warning: statement has no effect [-Wunused-value]
(int)x;
^
So schließe ich, dass das casting zu void
ist sehr Verschieden von casting zu anderen Arten, die als Ziel geben Sie die gleiche wie decltype(x)
oder etwas anderes. Meine Vermutung mögliche Erklärung ist:
- Es ist nur eine Konvention, dass
(void)x;
aber nicht auf die anderen wirft, wird Warnmeldungen unterdrücken. Alle Aussagen gleichermaßen haben keine Wirkung. - Dieser Unterschied ist irgendwie im Zusammenhang mit der Tatsache, dass
void x;
ist nicht eine gültige Aussage zu, währendshort x;
ist.
Welche von diesen, wenn mehr korrekt? Wenn keine, wie kann dann der Unterschied in der compiler-Warnungen erklärt werden?
- Es ist nur eine Konvention unter den Compiler, dass diese Besetzung unterdrückt die Warnungen. Der C++ - Standard nicht erwähnt Warnungen für "Anweisung hat keine Wirkung" an alle.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Casting für nichtig zu erklären, wird verwendet, um zu unterdrücken, dass der compiler Warnungen. Die Standard sagt in §5.2.9/4 sagt,
Diese Aussage:
Sagt "Ignorieren Sie den Wert von x an." Es gibt keine solche Art als
void
- es ist die Abwesenheit eines Typs. Es ist also sehr unterschiedlich von dieser:Welche sagt: "betrachten Sie x als wäre es ein integer." Wenn die resultierende ganze Zahl wird ignoriert, bekommen Sie eine Warnung (falls aktiviert).
Wenn Sie ignorieren, was ist nichts, es wird nicht als ein problem von GCC--und mit gutem Grund, denn casting für nichtig zu erklären, ist ein idiomatischer Weise zu ignorieren, eine variable explizit in C und C++.
void
?void
". Siehe [basic.Arten].(void)foo()
) zu sagen, dass Sie absichtlich ignoriert den Rückgabewert. Die einzige Zeit, die ich das image casting eine variable ungültig ist, wenn die variable wird nur verwendet, innen einige #ifdef code, und Sie wollen unterdrückt die Warnung, wenn der code ist nicht im Lieferumfang enthalten.assert()
so würde sonst produzieren Warnungen in release-builds.Der standard kein Mandat Generierung einer Warnung ("Diagnose" in standardese) für nicht verwendete lokale Variablen oder Funktionsparameter. Er wird auch nicht durch Mandat, wie so eine Warnung kann unterdrückt werden. Casting eine variable expression zu
void
um diese Warnung zu unterdrücken hat sich ein idiom in C und später C++ - community statt, weil das Ergebnis nicht in irgendeiner Weise verwendet werden (anders als z.B.(int)x
), so ist es unwahrscheinlich, dass der entsprechende code wird einfach fehlen. E. g.:Ich persönlich finde dieses übereinkommens zu verschleiern, noch, weshalb ich lieber eine Funktion verwenden, Vorlage:
Den idiomatischen Weg zu ignorieren-Funktion von Parametern ist jedoch zu unterlassen, Ihren Namen (wie oben gesehen). Eine häufige Verwendung habe ich für diese Funktion ist, wenn ich brauche, um in der Lage sein, um den Namen einer Funktion parameter bedingt kompilierten code wie ein
assert
. Ich finde z.B. die folgenden besser lesbar als die Verwendung von#ifdef NDEBUG
:[[maybe_unused]]
- Attribut anstelle von alle diese "kreativen" Möglichkeiten zu ignorieren parameter.Mögliche Nutzung:
Nun der iterator 'it' Punkte, um das Letzte element