2017-04-11 1 views
0

Dans le code ci-dessous, je lis un file.rec dans main et le mettre dans un char buf. Puis je passe ce buf et un pointeur de fonction pour la fonction getCallBack(), mais je passe la fonction de deux façons disponibles. Cette fonction reçoit donc le pointeur de fonction normalement de deux manières. Je suis donc intéressé de savoir quelle est la différence pour l'utiliser ou non.lors de l'utilisation "&" opérateur dans les pointeurs de fonction?

#include<stdio.h> 

void getCallBack(char buf[], void(*executeCallBack)(char[])){ 
    printf("callback recived\n"); 
    executeCallBack(buf); 
} 

void callBack(char buf[]){ 
    printf("executing callback...\n"); 
    printf("buf content: "); 
    printf("%s\n", buf); 
} 

void main() { 

    FILE *ReadingXmlFile = fopen("texto.rec", "r"); 
    char buf[10000]; 
    fread(buf, 1, 10000, ReadingXmlFile); 
    fclose(ReadingXmlFile); 

    printf("passing \"&callBack\"\n"); 
    getCallBack(buf, &callBack); 

    printf("passing \"callBack\"\n"); 
    getCallBack(buf, callBack); 
    // 
} 
+1

Une fonction se désintègre naturellement en un pointeur vers lui-même, similaire à la façon dont un tableau se décompose en un pointeur vers son premier élément. Je recommande d'être explicite à ce sujet, et toujours utiliser l'opérateur d'adresse '&'. –

Répondre

3

Il n'y a pas de différence. Le & est implicite.

Il est similaire à la façon dont, si vous avez un tableau someArray, alors someArray peut être utilisé au lieu de &someArray[0].

4

C'est un problème purement cosmétique. Dans les contextes où le type de fonction décline en type pointeur par lui-même (qui est presque partout), un unaire explicite & ne fait aucune différence sémantique. Choisissez ce qui vous semble le mieux. Efforcez-vous simplement d'être cohérent.


Pratiquement la même chose à l'utilisation explicite opérateur * lorsque vous appelez une fonction par un pointeur. Vous pouvez appeler votre rappel comme executeCallBack(buf) ou comme (*executeCallBack)(buf). Les deux sont équivalents. Encore une fois, choisissez votre style et respectez-le. Certains pourraient faire valoir que par souci de symétrie, si vous utilisez & lors de l'obtention de l'adresse, vous devez utiliser * lors de l'appel de la fonction.

+0

Donc 'sizeof callBack' est mauvais et' sizeof & callBack' est bon pour le contexte _other_? – chux

+0

@chux: Je ne suis pas sûr de comprendre la question. Ce que j'ai dit plus haut à propos de '&' ne s'applique qu'aux contextes où son opérande est de type fonction. Si 'callBack' lui-même est un pointeur (pas une fonction), alors c'est une histoire différente -' & 'fait une énorme différence dans de tels cas. – AnT