void
Typ
Der Typ void
kann nicht wie andere Typen für Variablen verwendet werden. Er wird in ganz bestimmten Situationen verwendet, um den Compiler das Verhalten von Code mitzuteilen. Je nach Situation bedeutet die Angabe void
dann ungültig
, zu ignorieren
, unbekannt
oder leer
. Grundsätzlich kann der Typ void
mit dem Begriff Nichts
übersetzt werden.
Details
Die häufigste Anwendung des Typs void
findet sich bei der Angabe des Rückgabetyps einer Funktion.
Eine Funktion, die mit void
deklariert wird, gibt keinen Wert zurück. In anderen Programmiersprachen wird dies auch als Prozedur
bezeichnet, dieser Begriff ist jedoch in C und C++ nicht üblich. Wird bei solchen Funktionen trotzdem versucht, mittels der return
-Anweisung einen Wert zurückzugeben, gibt ein C-Compiler eine Warnung aus: return with a value, in function returning void. In C++ ist die Rückgabe eines Wertes für eine Funktion mit void
als Rückgabetyp nicht erlaubt und ergibt einen Fehler: return-statement with a value, in function returning void.
Der Grund, wieso C nur eine Warnung und keinen Fehler ausgibt liegt darin, dass für eine Funktion grundsätzlich immer Platz für einen Rückgabewert reserviert wird, egal ob nun ein Wert zurückgegeben wird, oder nicht. Der C-Compiler schreibt somit selbst dann einen Rückgabewert an diese Stelle, wenn die Funktion mit void
deklariert wurde. Demgegenüber jedoch ist sowohl in C als auch in C++ das Ansprechen des Rückgabewertes einer Funktion ohne Rückgabewert nicht erlaubt und resultiert in der Fehlermeldung Void value not ignored as it ought to be. Der vermeindliche Rückgabewert wird als ungültig betrachtet.
Auch die Parameterliste einer Funktion kann mit void
gekennzeichnet werden:
In diesem Falle bedeutet die Angabe von void
, dass die Parameterliste explizit leer ist, bei einem Aufruf der Funktion somit keine Argumente erwartet werden. In C++ kann die Parameterliste der Funktion auch einfach leer gelassen werden, was genau dasselbe bedeutet. Durch die weite Verbreitung von C++ ist die Angabe void
somit kaum mehr bei der Parameterliste anzutreffen. In C jedoch bedeutet eine leere Parameterliste, dass die Anzahl Parameter bei der Funktions-Deklaration nicht bekannt ist und somit bei einer späteren Definition durchaus anders sein kann. Durch die Angabe von void
jedoch wird auch in C explizit die leere Parameterliste festgelegt.
Eine weitere Anwendung des Typs void
kann beim void
-Pointer, dem Pointer auf einen unbestimmten Typ, nachgelesen werden.
Explizites Verwerfen von Resultaten
In C evaluiert jeder Ausdruck zu einem Wert. Wenn in einem Ausdruck nur Operanden ausgewertet, nie aber geschrieben werden, so hat dieser Ausdruck keinen Effekt (in anderen Quellen wird Effekt
häufig als Nebeneffekt bezeichnet). Wenn eine ganze Anweisung keinen Effekt hat, so gibt ein Compiler heutzutage eine Warnung aus wie Statement has no effect.
Es gibt jedoch Fälle, bei welchen eine ebensolche Anweisung explizit geschrieben werden möchte. Da das schlussendliche Resultat einer Anweisung vom Compiler sowieso automatisch verworfen wird, kann der Ausdruck einfach nach void
gecastet werden. Aufgrund dieses Casts wird der Compiler somit explizit das Resultat verwerfen und auch keine Warnung ausgeben.
Am häufigsten wird dieses explizite Verwerfen bei überschüssigen Parametern benötigt. Manche Funktions-Signaturen definieren (aus verschiedenen Gründen) teilweise Parameter, welche innerhalb des ausprogrammierten Teils der Funktion niemals verwendet werden. Je nach Compiler und Einstellungen werden für solche Parameter Warnungen ausgegeben.
Um solche Warnungen zu unterdrücken, können folgende zwei Methoden angewendet werden:
discard result
overwrite with the same value
Bei der ersten Methode wird der unbenutzte Parameter einfach als Ausdruck hingeschrieben und die Anweisung mittels Semikolon ;
abgeschlossen. Durch das Casting nach void
wird die Warnung unterdrückt.
Bei der zweiten Methode wird dem Parameter derselbe Wert zugewiesen, den der Parameter bereits hat. Dadurch wird eine Anweisung erzeugt, welche explizit einen Effekt hat. Somit wird ebenfalls keine Warnung ausgegeben. Diese Methode ist jedoch weniger verbreitet, da sie für const
-Parameter nicht verwendet werden kann und sie eben explizit einen Effekt definiert, was dem semantischen Ziel, nämlich dem nicht-Ansprechen des Parameters widerspricht.
Beide Varianten werden von heutigen Compilern vollständig herausoptimiert und können auch mittels eines Preprozessor-Makros realisiert werden. Da das Casting nach void
ein wenig sicherer und verbreiteter ist, hier eine typische Makro-Definition:
Ein weiteres Beispiel einer Anweisung ohne Effekt ist die sogenannt leere Anweisung
. Sie besteht entweder aus einem alleinstehenden Semikolon ;
oder aus leeren geschweiften Klammern {}
.
Have a break.
Stretch and Relax.
Im Gegensatz zu anderen Anweisungen ohne Effekt wird ein Compiler bei solchen Anweisungen jedoch entweder überhaupt keine Warnung angeben oder aber beispielsweise bei Kontrollstrukturen sowas wie empty statement oder empty body. Das Verhalten ist jedoch compilerspezifisch.