Comment Vérifier si la fonction existe en C/C++
Certaines situations, dans mon code, j'arrive à la fin de l'invocation de la fonction uniquement si cette fonction est définie, ou autre chose que je devrais pas. Comment puis-je y parvenir ?
like:
if (function 'sum' exists ) then invoke sum ()
Peut-être dans l'autre sens autour de vous poser cette question est: Comment faire pour déterminer si la fonction est définie au moment de l'exécution et, si oui, alors invoquer.
- vous auriez à utiliser une sorte de chargement de la bibliothèque de support, par exemple dlopen
- Comment, exactement, ne vous proposons de retrouver dans une situation où vous voulez l'appeler
sum
mais ne sont pas sûr de savoir si il existe? Vous devez savoir s'il existe; vous êtes la personne qui écrit le code! - Vous devriez vraiment expliquer pourquoi demandez-vous. Dans quel contexte avez-vous besoin? Je n'ai jamais nécessaire que dans 35 ans de codage, dans tout langage compilé....
- je reçois le nom de la fonction en tant que paramètre de ligne de commande, et d'avoir à exécuter si il existe.
- dans ce cas, vous devez faire quelque chose comme
if(string(argv[1]) == "sum") { sum(); }
. - qui devrait être dit dans la question. Merci de modifier convenablement. J'ai fait un addenda à ma réponse.
- Mais dans le cas de la somme() n'est pas défini alors il l'habitude de travailler, suis-je la corriger?
- Encore une fois, vous devez définir un sous-ensemble adapté de fonctions pour être dite. Elle contient
sum
parce que vous savez quesum
est définie et est sensible à l'appel de cette façon. - double possible de puis-je re-définir une fonction ou vérifier si elle existe? (même si c'est marqué, C++)
- Double Possible de Est-il possible d'écrire en C++ modèle pour vérifier la fonction de l'existence?
Vous devez vous connecter pour publier un commentaire.
Tandis que d'autres réponses sont utiles conseils (
dlsym
, des pointeurs de fonction, ...), vous ne peut pas compiler C++ code faisant référence à une fonction qui n'existe pas. Au minimum, la fonction doit être déclaré; si elle ne l'est pas, votre code ne compile pas. Si rien n' (une unité de compilation, d'un objet fichier de bibliothèque) définit la fonction, l'éditeur de liens puisse se plaindre (sauf si elle est faible, voir ci-dessous).Mais vous devriez vraiment expliquer pourquoi vous demandez que. Je ne peux pas deviner, et il est possible d'atteindre votre objectif inavoué.
Avis que
dlsym
nécessite souvent des fonctions sans name mangling, c'est à dire déclarée commeextern "C"
.Si le codage sur Linux avec GCC, vous pouvez également utiliser le
weak
la fonction d'attribut dans les déclarations. L'éditeur de liens serait alors pas défini la faiblesse des symboles à null.addenda
Si vous obtenez le nom de la fonction à partir de certaines entrées, vous devez être conscient que seul un sous-ensemble de fonctions doivent être appelées de cette façon (si vous appelez une fonction arbitraire, sans soins, il va se planter!) et vous allez mieux construire explicitement que ce sous-ensemble. Vous pouvez ensuite utiliser un
std::map
, oudlsym
(avec chaque fonction dans le sous-groupe a déclaréextern "C"
). Notez quedlopen
avec unNULL
chemin donne une poignée pour le programme principal, qui vous devriez avoir un lien avec-rdynamic
pour qu'il fonctionne correctement.Vous voulez vraiment appeler par leur nom seulement un appareil de sous-ensemble défini de fonctions. Par exemple, vous ne voulez probablement pas à appeler de cette façon
abort
,exit
, oufork
.NB. Si vous connaissez dynamiquement la signature de la fonction appelée, vous pouvez utiliser libffi l'appeler.
Lorsque vous déclarez "somme" vous pouvez déclarer qu'il aime:
Puis, quand vous venez à l'utiliser, vous pourriez aller:
Je devine que vous êtes en provenance d'un langage de script où les choses sont tout à fait à l'exécution. La principale chose à retenir avec le C++ est le deux phases:
De sorte que tous les
#define
et des choses comme ça arrive au moment de la compilation.....
Si vous avez vraiment envie de tout faire au moment de l'exécution .. vous pourriez être intéressé par l'utilisation de certains des l'architecture de composants de produits là.
Ou peut-être un plugin type d'architecture est ce que vous êtes après.
utilisation de pointeurs de fonctions.
Je soupçonne que l'affiche a été à la recherche de quelque chose de plus le long des lignes de SFINAE la vérification/l'expédition. Avec les modèles C++, peut définir un modèle de fonctions, un qui appelle la fonction souhaitée (si elle existe) et celui qui ne fait rien (si la fonction n'existe pas). Vous pouvez ensuite faire le premier modèle dépendent de la fonction de votre choix, tel que le modèle est mal formé lorsque la fonction n'existe pas. Ceci est valable, car en C++ d'un modèle de substitution à l'échec n'est pas une erreur (SFINAE), de sorte que le compilateur va tout simplement tomber en arrière pour le second cas (qui, par exemple, ne pourrait rien faire).
Voir ici pour un excellent exemple: Est-il possible d'écrire un modèle pour vérifier la fonction de l'existence?
À l'aide de GCC, vous pouvez:
Si vous décommentez la touche func, il sera exécuté, sinon il affichera "no encontre de la touche func\n".
Si vous savez ce que la bibliothèque la fonction que vous souhaitez appeler, vous pouvez utiliser
dlsym()
etdlerror()
pour savoir si oui ou non il est là, et ce que le pointeur vers la fonction est.Edit: je n'aurais probablement pas fait usage de cette approche - au lieu de cela, je recommanderais Matiu la solution, je pense que c'est beaucoup mieux que la pratique. Cependant,
dlsym()
n'est pas très connu, donc je pensais que je le signale.Une autre manière, si vous êtes à l'aide de c++11 serait d'utiliser les foncteurs:
Vous aurez besoin de mettre ceci au début de votre fichier:
Le type d'un foncteur est déclaré dans ce format:
Vous pouvez ajouter une variable qui contient un foncteur pour la somme comme ceci:
Pour faciliter les choses, laissez raccourcir les param type:
Ensuite, vous pouvez remplir le foncteur var avec:
Un lambda:
Un pointeur de fonction:
Quelque chose qui "se lier" a créé:
Puis enfin à l'utiliser, c'est simple si la déclaration:
En résumé, les foncteurs sont le nouveau pointeur à une fonction, cependant ils sont plus polyvalents. Peut-être en fait inline si le compilateur est assez sûr, mais en général sont les mêmes que d'un pointeur de fonction.
Lorsqu'il est combiné avec std::bind et lambda, ils sont bien supérieur à l'ancien style C pointeurs de fonction.
Mais rappelez-vous, ils travaillent en c++11 et au-dessus des environnements. (Pas en C ou en C++03).
Vous pouvez utiliser
#pragma weak
pour les compilateurs qui le prennent en charge (voir la la faiblesse de symbole entrée de wikipedia).Cet exemple et le commentaire est de L'Histoire à l'Intérieur des Bibliothèques Partagées et le Chargement Dynamique:
"debug()", referenced from: _debugfunc in test-fc106e.o
.ld: symbol(s) not found for architecture x86_64