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.

void setSize(int x, int y);

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:

int getArea(void);

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
(void)unusedparameter;
unusedparameter = unusedparameter;

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:

#define UNUSED(x) (void)(x)

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.