void (Schlüsselwort)
Das Schlüsselwort void (englisch für nichtig, ungültig, leer) wird in einigen Programmiersprachen anstelle eines Datentyps benutzt, um anzugeben, dass keine Daten übergeben werden oder der Typ der Daten nicht angegeben ist. Syntaktisch wird void
wie ein Datentyp behandelt, aber es kann nur an bestimmten Stellen stehen. So ist es zum Beispiel nicht möglich, eine Variable vom Typ void
zu deklarieren.
void als Rückgabetyp
[Bearbeiten | Quelltext bearbeiten]In den Programmiersprachen C, C++, D, Java und C# wird void
für Funktionen bzw. Methoden ohne Rückgabewert (sog. Prozeduren) benutzt. In diesen Sprachen muss syntaktisch für jede Funktion bzw. Methode ein Rückgabetyp angegeben werden. Wenn kein Wert zurückgegeben wird, steht stattdessen void
.
Das folgende Beispiel definiert eine Methode ohne Rückgabewert in Java:
void hallo() {
System.out.println("Hallo Welt!");
}
void in C und C++
[Bearbeiten | Quelltext bearbeiten]In C und C++ ist void
syntaktisch und semantisch ein Basisdatentyp. Es ist der sogenannte „leere Datentyp“ (englisch empty type) und ein „incomplete type“. Letzteres sorgt dafür, dass man keine Objekte vom Typ void
anlegen kann.
void
wird in diesen Sprachen, außer als Platzhaltertyp für Funktionen ohne Rückgabewert (s. o.), für drei weitere Aufgaben genutzt:
Untypisierte Zeiger
[Bearbeiten | Quelltext bearbeiten]Mit void*
wird ein Zeiger deklariert, ohne den Typ der Daten anzugeben, auf die der Zeiger verweist (untypisierter Zeiger, pointer to void). Ein untypisierter Zeiger kann nicht dereferenziert oder für Zeigerarithmetik benutzt werden, sondern muss zuerst per Typumwandlung in einen typisierten Zeiger umgewandelt werden.
Jeder Datenzeiger kann in ein Void-Zeiger umgewandelt werden. Bei der Rückumwandlung in den ursprünglichen Datentyp fordert der Sprachstandard, dass der gleiche Wert erhalten wird. Eine Umwandlung des Void-Zeigers in einen anderen als den ursprünglichen Datentyp ist nur für char
-Zeiger erlaubt, andernfalls ist das Programm ungültig ("undefined behavior"), wobei der Compiler dies im Allgemeinen nicht erkennen kann.
Beispiel:
#include <stdio.h>
int main()
{
int a=10;
void *ptr;
ptr=&a; /* Zeiger zeigt nun auf die Adresse der Ganzzahlvariable a */
printf("Wert auf den der Zeiger zeigt : %d",*(int*)ptr); /* Ausgabe: 10 */
return 0;
}
Funktionsargumente
[Bearbeiten | Quelltext bearbeiten]Funktionen ohne Argumente sollten in C mit dem Schlüsselwort void
anstelle einer leeren Argumentliste deklariert werden, wie in folgendem Beispiel:
void hallo(void) {
printf("Hallo Welt!\n");
}
Dieser Sonderfall ist nötig, weil es in C zwei verschiedene Arten gibt, Funktionen zu deklarieren. In der ursprünglichen Notation (old-style) wurden im Funktionskopf die Typen der Argumente nicht angegeben; die neue Notation wurde eingeführt, damit der Compiler die Anzahl und die Typen der Argumente bei einem Funktionsaufruf überprüfen kann. Um Kompatibilität mit bestehendem C-Code zu gewährleisten, wurden Deklarationen mit der alten Notation weiterhin erlaubt. Damit Funktionsdeklarationen ohne Argumente nicht fälschlicherweise als old-style erkannt werden, wurde festgelegt, dass in diesem Fall das Schlüsselwort void
anstelle der Argumentliste steht.
In C++ sind Old-style-Funktionsdeklarationen dagegen nicht möglich.[1] Daher ist void
als Argumentliste äquivalent zu einer leeren Argumentliste.[2]
Funktions-Rückgabe
[Bearbeiten | Quelltext bearbeiten]void
als Rückgabetyp einer Funktion bedeutet, dass diese Funktion keinen Wert zurückliefert.
Beispiel:
void addiere(int s1, int s2, double *summe) {
*summe = s1 + s2;
return; /* formal erlaubt aber in diesem Fall ohne jegliche Wirkung, d.h. kann entfallen */
}
Cast zu void
[Bearbeiten | Quelltext bearbeiten]Ein Cast-Ausdruck zum Typ void ist möglich und zeigt an, dass der jeweilige Wert explizit nicht benötigt wird. Das dient dazu, etwaige Compiler-Warnungen über nicht benutzte Funktionsargumente, Rückgabewerte oder Variablen zu unterdrücken.
int send_event(Event ev);
void handle_event(Event ev, Source src, void* userdata) {
(void)userdata; // wird in dieser Funktion nicht benötigt.
(void)send_event(ev); // Rückgabewert wird nicht ausgewertet.
}
In C++ ist dafür auch die Schreibweise static_cast<void>(…)
möglich.
Einzelnachweise
[Bearbeiten | Quelltext bearbeiten]- ↑ Bjarne Stroustrup: The C++ Programming Language, Special Edition. Addison-Wesley, Reading MA 2000, ISBN 978-0-201-70073-2, S. 816–817.
- ↑ Margaret A. Ellis, Bjarne Stroustrup: The Annotated C++ Reference Manual. Addison-Wesley, Reading MA 1990, ISBN 978-0-201-51459-9, S. 138.