Gibt es funktional und syntaktisch einen Unterschied zwischen einer Funktion, deren Prototyp ist int foo(void)
und int foo(void *)
?
Ich kenne den Unterschied zwischen zum Beispiel int bar(int)
und int bar(int *)
- einer von ihnen sucht nach einem int und der andere sucht nach einem int-Zeiger. Hat void
verhalten sich genauso?
c++
c
function-prototypes
Nick Reed
quelle
quelle
foo(void)
undfoo()
.Antworten:
Ab dieser Antwort auf Software Engineering
void
wird je nach Verwendungszweck besonders behandelt. InC
undC++
,void
wird verwendet , um anzuzeigen , eine Abwesenheit von einem Datentyp, während dievoid *
verwendet wird , um anzuzeigen , einen Zeiger, der Punkte auf bestimmte Daten / Platz im Speicher , die nicht einen Typen besitzen.void *
kann nicht alleine dereferenziert werden und muss zuerst in einen anderen Typ umgewandelt werden. Diese Besetzung muss nicht explizit in seinC
, sondern muss explizit in seinC++
. (Aus diesem Grund geben wir den Rückgabewert von malloc nicht ausvoid *
.)Bei Verwendung mit einer Funktion als Parameter
void
bedeutet dies , dass keine Parameter vorhanden sind, und ist der einzige zulässige Parameter. Der Versuch, void wie einen Variablentyp zu verwenden oder andere Argumente einzuschließen, führt zu einem Compilerfehler:Es ist ebenfalls unmöglich, eine Variable mit dem folgenden Typ zu deklarieren
void
:void
Ein Rückgabewert für eine Funktion gibt an, dass keine Daten zurückgegeben werden. Da es unmöglich ist, eine Variable vom Typ zu deklarierenvoid
, ist es unmöglich, den Rückgabewert einervoid
Funktion zu erfassen , selbst mit einem ungültigen Zeiger.Das Typlose
void *
ist ein anderer Fall. Ein ungültiger Zeiger zeigt einen Zeiger auf eine Stelle im Speicher an, zeigt jedoch nicht den Datentyp an diesem Zeiger an. (Dies wird verwendet, um Polymorphismus in C zu erzielen , z. B. mit der Funktion qsort () .) Die Verwendung dieser Zeiger kann jedoch schwierig sein, da es sehr einfach ist, sie versehentlich in den falschen Typ umzuwandeln. Der folgende Code wirft keine Compilerfehler einC
, führt jedoch zu undefiniertem Verhalten:Der folgende Code ist jedoch vollkommen legal. Das Umwandeln von und zu einem leeren Zeiger ändert niemals den Wert, den er enthält.
Gibt als Funktionsparameter an,
void *
dass der Typ der Daten an dem Zeiger, den Sie übergeben, nicht bekannt ist und es an Ihnen, dem Programmierer, liegt, alles, was sich an diesem Speicherort befindet, richtig zu behandeln. Gibt als Rückgabewert an,void *
dass der Typ der zurückgegebenen Daten nicht bekannt oder typenlos ist und vom Programm verarbeitet werden muss.tl; dr
void
in einem Funktionsprototyp bedeutet "keine Daten" und zeigt keinen Rückgabewert oder keine Parameter an,void *
in einem Funktionsprototyp bedeutet "die Daten am Zeiger, den diese Funktion erhält, haben keinen bekannten Typ" und gibt einen Parameter oder Rückgabewert an deren Zeiger muss in einen anderen Typ umgewandelt werden, bevor die Daten am Zeiger verwendet werden können.quelle
void * ... must be cast to another type first, but may be done so without an explicit cast.
Nicht wahr in C ++. In C ++ muss das Konvertierungsformularvoid*
explizit sein. PS, das eine explizite Umwandlung aufruft, ist redundant, da die Umwandlung per Definition eine explizite Konvertierung ist.foo(void)
- Funktion ohne Parameterfoo(void *)
- Funktion mit einemvoid *
ParameterWas ist
void *
? Es ist nur der Zeiger auf die Daten ohne angegebenen Typ. Es kann in jeden anderen Zeigertyp umgewandelt werdenquelle
(type) vs. (type *)
Universum der Paare ist, weil void eigentlich kein Typ ist.Da ist ein Unterschied:
int foo(void)
deklariert eine Funktion, die keine Argumente akzeptiert.int foo(void *)
deklariert eine Funktion, die ein einzelnes Argument vom Typ akzeptiertvoid*
.In C ++
int foo(void)
ist gleichbedeutend mitint foo()
.quelle