D'autres réponses sont correctes, et intéressant, mais vous devez être conscient que, dans portable C99, il n'y a aucun moyen d'avoir de véritables fermetures comme les fonctions C (et c'est un des fondamentaux de la limitation de C). Si vous ne sont pas conscients de ce que les fermetures sont, de lire la page wiki avec soin sur eux (et aussi lire SICP, notamment son §1.3). Notez toutefois que, dans C++11 vous avez des fermetures, en utilisant std::function et lambda-expressions. Et la plupart des autres langages de programmation (Ocaml, Haskell, Javascript, Lisp, Clojure, Python, ....) ont des fermetures.
En raison de l'absence d'une véritable fermetures en C ("mathématiquement" le seul fermée valeurs dans les fonctions C sont des variables globales ou statiques ou des littéraux), la plupart des bibliothèques accepter C pointeurs de fonction de fournir une API de manipulation des rappels avec certaines données du client (un exemple simple pourrait être qsort_r, mais plus sérieusement regarder à l'intérieur de GTK). Que les données du client (généralement un pointeur opaque) peut être utilisé pour maintenir fermé valeurs. Vous voulez probablement de suivre une convention similaire (donc systématiquement passer le pointeur de fonction en tant que rappels, ainsi que quelques autres données du client), de sorte que vous aurez besoin de modifier les signatures de vos fonctions C (au lieu de passer juste un cru de pointeur de fonction, vous allez passer un pointeur de fonction et de certaines données du client comme un rappel, pour "émuler" fermetures).
Vous peut parfois générer une fonction C au moment de l'exécution (à l'aide de caractéristiques non standard, probablement avec l'aide du système d'exploitation ou de certains de bibliothèque externe). Vous pourriez utiliser certains JIT compiler la bibliothèque comme GNU foudre, libjit (les deux serait de générer une certaine lenteur de l'exécution de code rapidement), asmjit (vous allez générer chaque instruction machine explicitement, et il est de votre responsabilité d'émettre rapide x86-64 du code), GCCJIT ou LLVM (les deux sont au-dessus de compilateurs existants peuvent donc être utilisés pour emit un peu lentement - certains code optimisé). Sur POSIX & systèmes Linux, vous pouvez également émettre un peu de code C dans certains fichier temporaire /tmp/tempcode.c
, fourche à la compilation (par exemple, gcc -fPIC -Wall -O2 -shared /tmp/tempcode.c -o /tmp/tempcode.so
) de ce code dans un plugin, et de charger dynamiquement qui a généré un plugin à l'aide dlopen(3) & dlsym(3)..
BTW, nous ne savons pas ce que le réel de l'application, vous êtes le codage est, mais vous pourriez envisager l'incorporation à l'intérieur de certains interprète, par exemple, Lua ou la Ruse. Vous pourrez ensuite utiliser et fournir des rappels à l'évaluateur embarqué/interprète.