Sur le plan fonctionnel et syntaxique, y a-t-il une différence entre une fonction dont le prototype est int foo(void)
et int foo(void *)
?
Je connais la différence entre, par exemple, int bar(int)
et int bar(int *)
- l'un d'eux cherche un int, et l'autre cherche un pointeur int. Se void
comporte- t-il de la même manière?
c++
c
function-prototypes
Nick Reed
la source
la source
foo(void)
etfoo()
.Réponses:
De cette réponse sur le génie logiciel,
void
est traité spécialement en fonction de la façon dont il est utilisé. DansC
etC++
,void
est utilisé pour indiquer l'absence d'un type de données, tandis qu'ilvoid *
est utilisé pour indiquer un pointeur qui pointe vers des données / un espace en mémoire qui n'ont pas de type.void *
ne peut pas être déréférencé seul et doit d'abord être converti en un autre type. Cette distribution n'a pas besoin d'être explicite dansC
, mais doit être explicite dansC++
. (C'est pourquoi nous ne convertissons pas la valeur de retour de malloc, qui l'estvoid *
.)Lorsqu'il est utilisé avec une fonction comme paramètre,
void
signifie une absence totale de tout paramètre et est le seul paramètre autorisé. Tenter d'utiliser void comme un type de variable ou d'inclure d'autres arguments entraîne une erreur de compilation:Il est également impossible de déclarer une variable de type
void
:void
comme valeur de retour pour une fonction indique qu'aucune donnée ne sera retournée. Puisqu'il est impossible de déclarer une variable de typevoid
, il est impossible d'attraper la valeur de retour d'unevoid
fonction, même avec un pointeur void.L'apatride
void *
est un cas différent. Un pointeur vide indique un pointeur vers un emplacement en mémoire, mais n'indique pas le type de données à ce pointeur. (Ceci est utilisé pour atteindre le polymorphisme en C , comme avec la fonction qsort () .) Ces pointeurs peuvent cependant être difficiles à utiliser, car il est très facile de les convertir accidentellement dans le mauvais type. Le code ci-dessous ne générera aucune erreur de compilationC
, mais entraînera un comportement indéfini:Le code suivant, cependant, est parfaitement légal; la conversion vers et depuis un pointeur vide ne modifie jamais la valeur qu'il contient.
En tant que paramètre de fonction,
void *
indique que le type de données sur le pointeur que vous transmettez n'est pas connu, et c'est à vous, le programmeur, de gérer correctement tout ce qui se trouve à cet emplacement mémoire. En tant que valeur de retour,void *
indique que le type des données renvoyées n'est pas connu ou est sans type et doit être géré par le programme.tl; dr
void
dans un prototype de fonction signifie "pas de données" et indique aucune valeur de retour ou aucun paramètre,void *
dans un prototype de fonction signifie "les données au pointeur que cette fonction est donnée n'ont pas de type connu" et indiquent un paramètre ou une valeur de retour dont le pointeur doit être converti en un type différent avant que les données du pointeur puissent être utilisées.la source
void * ... must be cast to another type first, but may be done so without an explicit cast.
Pas vrai en C ++. En C ++, le formulaire de conversionvoid*
doit être explicite. PS appelant un cast explicite est redondant car le cast est par définition une conversion explicite.foo(void)
- fonction sans paramètresfoo(void *)
- fonction avec unvoid *
paramètreQu'est-ce que c'est
void *
? Il s'agit simplement du pointeur vers les données sans type spécifié. Il peut être converti en tout autre type de pointeurla source
(type) vs. (type *)
univers des couples car le vide n'est pas vraiment un type.Il existe une différence:
int foo(void)
déclare une fonction qui n'accepte aucun argument.int foo(void *)
déclare une fonction qui accepte un seul argument de typevoid*
.En C ++,
int foo(void)
est équivalent àint foo()
.la source