web-dev-qa-db-fra.com

Que signifie "typedef void (* Something) ()"

J'essaie de comprendre ce que cela signifie, le code que je regarde a

en .h

typedef void (*MCB)();
static MCB     m_process;

en .C

MCB Modes::m_process = NULL;

Et parfois quand je le fais

m_process();

J'ai des erreurs de segmentation, c'est probablement parce que la mémoire a été libérée, comment puis-je déboguer une fois libérée?

J'espère que mes questions sont claires.

36
DogDog

Il définit un type de pointeur à fonction. Les fonctions retournent nulles et la liste d'arguments n'est pas spécifiée car la question est (actuellement, mais éventuellement à tort) étiquetée C; si elle était étiquetée C++, la fonction ne prendrait aucun argument. Pour en faire une fonction qui ne prend aucun argument (en C), vous utiliseriez:

typedef void (*MCB)(void);

C'est l'un des domaines où il existe une différence significative entre C, qui n'exige pas encore de prototypage de toutes les fonctions avant d'être défini ou utilisé, et C++, qui le fait.

44
Jonathan Leffler

Il introduit un type de pointeur de fonction, pointant sur une fonction ne renvoyant rien (void), ne prenant aucun paramètre et nommant le nouveau typeMCB.

5
Jim Brissom

Le typedef définit MCB comme le type d'un pointeur sur une fonction qui ne prend aucun argument et renvoie void.

Notez que MCB Modes::m_process = NULL; est C++ et non C. De plus, en C, la typedef devrait être vraiment typedef void (*MCB)(void);.

Je ne suis pas sûr de ce que vous entendez par "la mémoire a été libérée". Vous avez un pointeur statique sur une fonction. une fonction ne peut pas être libérée. Au mieux, votre pointeur a été réinitialisé quelque part. Il suffit de déboguer avec une surveillance de la mémoire sur m_process.

4

C'est un pointeur de fonction. Vous obtenez une erreur de segmentation parce que vous essayez d'appeler une fonction dont l'adresse n'est pas valide (NULL).

Selon votre exemple spécifique, la fonction ne doit renvoyer aucune valeur (void) et ne doit recevoir aucun paramètre ().

Cela devrait fonctionner:

void a()
{
    printf("Hello!");
}

int main(int arcg, char** argv)
{
    m_process = a;
    m_process(); /* indirect call to "a" function, */
    // Hello!
}

Les pointeurs de fonction sont couramment utilisés pour certaines formes de gestion d'événements en C. Ce n'est pas sa seule utilisation, bien que ...

3
Pablo Santa Cruz

Prenons un exemple

typedef void (*pt2fn)(int);

Ici, nous définissons un type pt2fn. Les variables de ce type renvoient à des fonctions qui prennent un entier comme argument et ne renvoient aucune valeur.

pt2fn kk;

Ici, kk est une variable de type pt2fn, qui peut pointer sur toute fonction prenant un entier en entrée et ne renvoyant aucune valeur.

0