8
votes

Pouvez-vous exécuter une fonction sur l'initialisation en C?

Y a-t-il un mécanisme ou un tour pour exécuter une fonction lorsqu'un programme charge?

Qu'est-ce que j'essaie d'atteindre ... xxx

mais évidemment regrette_function ne fonctionnera pas.

Donc, donc une astuce en C ++ est de Utilisez l'initialisation pour effectuer une fonction d'exécution

quelque chose comme xxx

mais cela ne fonctionne pas dans C. Donc, je cherche donc à la recherche de ça Utilisation de la norme C (Nothing Platform / Compilateur Spécifique)


1 commentaires

Parce que je veux un nombre de fichiers .C, et je ne veux pas que les gens devaient se rappeler de faire la fonction de registre dans la principale ....


3 Réponses :


17
votes

Si vous utilisez GCC, vous pouvez le faire avec un attribut constructeur code> attribut de fonction, par exemple: xxx pré>

Il n'y a pas de moyen portable de le faire en C, Cependant. P>

Si cela ne vous dérange pas de jouer avec votre système de construction, vous avez plus d'options. Par exemple, vous pouvez: P>

#define CONSTRUCTOR_METHOD(methodname) /* null definition */

CONSTRUCTOR_METHOD(foo)


7 commentaires

sympa, c'est ce que je veux, mais j'espérais quelque chose de plus standard c


La solution de BDonlan n'utilise pas C ++. Lisez-la à nouveau; C'est simplement spécifique à la GCC.


Il a changé de réponse, il avait également eu une solution C ++


Construire le script est un peu tracas car cela fait partie d'un cadre qui devrait être assez transparent pour s'intégrer à votre projet. Je pourrais faire du malement ..... je pourrais faire une structure (à l'aide d'une macro) et mettre une chaîne magique et un pointeur de fonction, puis au moment de l'exécution, regardez à travers la mémoire pour la chaîne magique et récupérer la structure :-)


Cela va être encore moins portable que d'utiliser l'extension du constructeur de la GCC, je pense. De plus, il y a une chance d'un faux positif entraînant une erreur très difficile à déboguer.


Quels compilateurs essayez-vous de cibler BTW?


Idéalement, la plupart des compilateurs intégrés (qui sont une écrasement d'étrangeté d'une étrangeté au mieux de fois) ainsi que des compilateurs MS / GCC plus standard



0
votes

Il n'y a pas de moyen standard de cela, bien que GCC fournit un attribut constructeur pour les fonctions.

La manière habituelle de veiller à ce que la pré-installation a été effectuée (autre qu'une simple initialisation variable à Une valeur de temps de compilation) consiste à s'assurer que toutes les fonctions nécessitant cette pré-installation. En d'autres termes, quelque chose comme: xxx

Ceci est le mieux fait dans une bibliothèque distincte puisqu'il vous isole de la mise en œuvre.


1 commentaires

Ouais ... Cependant, dans mon cas, je veux une pré-installation où une fonction sera enregistrée et stockée dans une liste ..... puis plus tard sur quelque chose passera dans cette liste exécutant les fonctions enregistrées. Actuellement, cela signifie que chaque fonction doit être explicitement ajoutée dans un emplacement central. Je voulais trouver un tour où la fonction peut être enregistrée au point de déclaration



3
votes

Standard C ne supporte pas une telle opération. Si vous ne souhaitez pas utiliser de fonctionnalités spécifiques au compilateur pour le faire, votre prochain meilleur pari pourrait être de créer un drapeau statique global initialisé à FALSE. Ensuite, chaque fois que quelqu'un invoque l'une de vos opérations qui nécessitent l'enregistrement du pointeur de fonction, vous vérifiez que le drapeau. S'il est faux, vous enregistrez la fonction, puis définissez le drapeau sur true. Les appels ultérieurs n'auront alors pas à effectuer l'enregistrement. Ceci est similaire à l'instanciation paresseuse utilisée dans le modèle de conception OO singleton.


0 commentaires