2010-09-25 3 views
1

ueach est une fonction qui effectue une boucle dans une chaîne Unicode et exécute le rappel sur chaque caractère en lui passant une chaîne de caractère unique.Avertissement de pointeur de fonction étrange en C

string ueach(string s, void *function(string)) { 
    unsigned long i; 
    for (i = 0; i < s.length; i++) 
     function(uchar(s, i)); 
} 

Si j'ai un rappel testing:

void testing(string c) { 
    puts(utoc(c)); 
} 

qui imprime le caractère donné (utoc convertit la chaîne Unicode UTF-8 char *) tout fonctionne très bien. Le code:

string a = ctou("Hello, world!"); 
ueach(a, &testing); 

Cependant, je reçois cet avertissement:

test.c: In function ‘main’: 
test.c:8: warning: passing argument 2 of ‘ueach’ from incompatible pointer type 
ulib:171: note: expected ‘void * (*)(struct string)’ but argument is of type ‘void (*)(struct string)’ 

Si je mets entre parenthèses autour de la partie de la fonction du prototype ueach comme ceci:

string ueach(string s, void (*function)(string)) { ... } 

il fonctionne très bien aussi, sans avertissement. Quelle est la différence entre void * (*)(struct string) et void (*)(struct string)?

Quelle est la différence entre void *function(string) et void (*function)(string)?

Répondre

4
  • void * (*)(struct string) - pointeur vers une fonction renvoyant un void *.
  • void (*)(struct string) - pointeur vers la fonction renvoyant void.
  • void *function(string) - fonction renvoyant un void *
  • void (*function)(string) - pointeur de fonction retour void

Le troisième désintégrations à la première, parce que:

« , sauf quand il est l'opérande du L'opérateur sizeof ou l'opérateur unaire & , un indicateur de fonction avec type 'type de retour de fonction' est converti en une expression qui a type 'pointeur sur la fonction retournant type'. "

C99 §6.3.2.1/4

3

C'est juste une question de priorité des opérateurs. Dans le cas d'erreur, le compilateur l'analyse comme une fonction renvoyant un void *, (un pointeur vers quelque chose), plutôt qu'un pointeur vers une fonction retournant void.