Question

j'ai un static inline Fonction définie dans un fichier H, et à un moment donné d'un fichier C, j'attribue un pointeur à la fonction, quelque chose comme ceci:

foo.h:

static inline void frobnicate(void) {
    // frobs something.
}

foo.c

#include "foo.h"

void execute(void (*func)(void) ) {
    func();
}

void blahBlahBlah(void) {
    execute(frobnicate);
}

bar.c

#include "foo.h"
// ...
frobnicate();

Je pense donc que ce qui se passera ici, c'est que le compilateur inservera l'appel à frobnicate de Bar.c, mais dans foo.c, il devra en fait créer une fonction pour implémenter frobnicate, afin qu'il puisse y avoir un pointeur de travail.

Quelqu'un peut-il confirmer si ma compréhension est exacte et me corriger autrement?

Était-ce utile?

La solution

inline est l'une des imprévues de la norme C. Sa principale signification est de pouvoir mettre la définition d'une fonction dans un fichier d'en-tête sans avoir à faire face aux problèmes de «définition multiple» au moment du lien.

La manière officielle en C99 et C11 pour faire ce que vous voulez réaliser est d'avoir le inline Définition dans le fichier d'en-tête, sans le static. Étant donné que vous avez également besoin que le symbole soit émis, vous devez dire au compilateur dans quelle unité de compilation cela devrait être. Une telle instanciation peut être effectuée en ayant un déclaration dans ce fichier .c où vous omettez le inline mot-clé.

Le plus naturellement, vous pouvez utiliser le fichier .c où vous avez réellement besoin du symbole.

Autres conseils

Oui, tu as raison. Lorsque vous apportez le pointeur vers la fonction, le compilateur doit créer une version "autonome" où le code peut être appelé comme une fonction normale.

L'avantage de l'inlinaison d'une fonction est que le code d'appel ne doit pas être créé et que toute autre optimisation peut être appliquée pour intégrer à la fois la fonction de l'appelant et la fonction inclinée. Mais lorsque vous devez faire un appel régulier à la fonction (comme lorsque vous prenez l'adresse pour l'appeler ce dernier), ces optimisations ne sont plus possibles.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top