Je suis confus quant à la signification de void *function()
.
Est-ce un pointeur pour fonctionner ou une fonction qui revient void*
? Je l'ai toujours utilisé sur les structures de données comme une fonction récursive renvoyant un pointeur, mais quand j'ai vu un code dans multithreading ( pthread
) il y a la même déclaration de fonction. Maintenant, je ne sais pas quelle est la différence entre eux.
c++
c
pointers
function-pointers
declaration
user9515151
la source
la source
void*function();
est syntaxiquement correct. Par exemple, pour Python, ils ont choisi une décision différente - le format fait partie de la syntaxe. À mon humble avis, les deux façons ont leur pour et leur contre.void *function()
est une fonction prenant un nombre arbitraire d'arguments et renvoyant une valeur qui, lorsqu'elle est déréférencée, est de type void . En C ++,void* function()
est une fonction ne prenant aucun argument et renvoyant une valeur de pointer-to-void . Vous devez vous décider sur la langue que vous demandez.void *
. Après tout, même si vous le pouviez, que feriez-vous avec unvoid
?Réponses:
La fonction a le type de retour
void *
.Donc je préfère toujours dans de tels cas séparer le symbole
*
du nom de la fonction commeEt comme
Jarod42
indiqué dans un commentaire, vous pouvez réécrire la déclaration de fonction en C ++ en utilisant le type de retour de fin commeSi vous voulez déclarer un pointeur pour fonctionner, vous devez écrire
Ou
Ou un pointeur sur la fonction qui renvoie le pointeur sur la fonction
la source
void* function();
. Ce n'est pas si tentant ... ;-) (L'édition s'est produite juste en écrivant ceci.)void * reader();
alors aupthread_create(&thread1,null,reader,reader_arg)
lieu depthread_create(&thread1,null,&reader,reader_arg)
auto function() -> void*
(C ++). :)typedef
sert ... ;-)Chaque fois que je ne suis pas sûr des problèmes de syntaxe C, j'aime utiliser l' utilitaire cdecl ( version en ligne ) pour interpréter pour moi. Il traduit entre la syntaxe C et l'anglais.
Par exemple, je saisis votre exemple
void *foo()
et il est revenuPour voir à quoi ressemblerait l'autre syntaxe, je saisis
declare foo as pointer to function returning void
et il est retournéCela devient particulièrement utile lorsque vous disposez de plusieurs niveaux de typecasts, d'étoiles ou de crochets dans une seule expression.
la source
Il s'agit d'une fonction renvoyant un pointeur vers
void
.Pensez à votre déclaration de cette façon:
Ce serait une fonction retournant
void
(ou rien):Pensez à la déclaration ci-dessus de cette façon:
Un moyen beaucoup plus simple de les écrire est d'utiliser
typedef
s:Cela élimine généralement la confusion autour des pointeurs de fonction et est beaucoup plus facile à lire.
la source
Les déclarations en C / C ++ sont lues de l'identifiant vers l'extérieur suivant la priorité de l'opérateur .
Un rapide coup d'œil au tableau de priorité des opérateurs C / C ++ dans wikipedia révèle que l'opérateur d'appel de fonction
()
a une priorité plus élevée que l'opérateur d'indirection*
. Ainsi, vos déclarations de fonction se lisent comme suit:Commencez par l'identifiant:
function
estfunction()
une fonction qui ne prend aucun argumentvoid* function()
et renvoie avoid*
.Ce principe général s'applique également aux déclarations de tableau (a
[]
également une priorité plus élevée que*
) et aux combinaisons des deux. Doncest lu comme
arr
estarr[42]
un tableau de 42 éléments qui sont*arr[42]
pointeurs vers(*arr[42])()
fonctions qui ne prennent aucun argument etint *(*arr[42])()
retourner unint*
.Il faut un peu de temps pour s'y habituer, mais une fois que vous avez compris le principe, il est facile de lire ces déclarations sans ambiguïté.
la source