J'ai écrit une fonction de journalisation simple qui affiche un horodatage et utilise vprintf()
pour émuler printf()
. Maintenant, mon programme principal lit un fichier de configuration dans un struct configuration
. Je prévois de faire en sorte que la fonction de journalisation utilise cette configuration pour déterminer où elle doit se connecter (std {out, err}, syslog, un autre fichier, ...). Alors, quelle serait la meilleure façon de faire savoir à ma fonction de journalisation où elle devrait se connecter? Je pense à faire de mon struct configuration * config
une variable globale, déclarée juste avant main()
et ayant extern struct configuration * config
dans log.h afin que log.c puisse l'utiliser. Mais tout le monde continue à dire que "les variables globales sont mauvaises, ne les utilise pas" alors j'aimerais savoir s'il y a une meilleure façon de le faire.Configuration d'une fonction de journalisation
Répondre
Eh bien, la configuration globale doit être globale. Donc, je considérerais cela comme une exception à la règle. Cependant, vous pouvez vouloir exposer le struct
comme const
dans la plupart des cas. Cela permettrait de préciser quels modules changent l'état global dans le futur. Pour ce faire, utilisez une fonction globale qui expose un pointeur const
au lieu d'un extern
direct. En fait, vous pouvez également déclarer la configuration struct
comme static
. Cela éliminerait davantage l'accès inattendu.
Si cette configuration de journalisation s'applique (et s'appliquera toujours) à tout moment à l'ensemble du système, alors ce serait l'une des rares fois où une variable globale pourrait être utilisée, à mon avis.
Vous devez déterminer si vous avez besoin de la structure de configuration globale ou de la valeur de configuration de journalisation.
- 1. Appels de fonction dans le fichier de configuration de journalisation
- 2. Groovy - configuration des propriétés de journalisation en fonction de l'environnement
- 3. Configuration de la journalisation ServiceStack
- 4. Fichier de configuration de journalisation Python
- 5. Configuration du comportement de journalisation de Teamcity
- 6. Configuration de journalisation Grails avec différents appenders
- 7. Nom de la fonction actuelle de journalisation
- 8. Configuration du niveau de journalisation de HtmlUnit dans Play-SBT
- 9. Python set filemode dans le fichier de configuration de journalisation
- 10. . Outil de journalisation Net pouvant changer de configuration dynamiquement
- 11. Configuration de la journalisation pour un Tomcat Embedded plugin Maven
- 12. Configuration de la journalisation des communions dans Glassfish
- 13. Configuration de la journalisation SSIS pour la connexion d'un fichier
- 14. Pyramid ne tient pas ma configuration de journalisation
- 15. Configuration correcte de la journalisation pour Sinatra + DataMapper
- 16. EntLib5: Bloc d'application de journalisation, configuration via code au lieu d'un fichier de configuration?
- 17. Cadre de journalisation Flex
- 18. Différents niveaux de journalisation entre la journalisation SFL4J et JDK
- 19. Paramètres de la fonction de journalisation dans MATLAB
- 20. journalisation des appels de fonction spécifiques à des journaux spécifiques
- 21. Comment arrêter la journalisation d'un appel de fonction dans Firebug?
- 22. active la journalisation de tilestache
- 23. Objets de journalisation Python
- 24. Problèmes de journalisation avec le module de journalisation de Python
- 25. Configuration d'ELMAH avec journalisation SQL Server avec chaîne de connexion cryptée
- 26. Journalisation conditionnelle avec log4net
- 27. Fonctionnalité de journalisation Qt/intégrée
- 28. Puis-je modifier la configuration du bloc de journalisation de la bibliothèque d'entreprise lors de l'exécution?
- 29. web Configuration SMS - Mail Fonction
- 30. chaîne de journalisation en python
Je créerais définitivement une variable globale dans le fichier source de ma classe config et je déclarerais extern dans l'en-tête (pas un pointeur vers une instance mais une instance globale). Je n'ai jamais eu de problème avec ça. Vous n'avez qu'à lui donner un nom suffisamment unique pour éviter les collisions puisque vous êtes dans un espace de noms global. – RedX