En supposant que votre compilateur C ++ les prend en charge, y a-t-il une raison particulière de ne pas les utiliser __FILE__
, __LINE__
et __FUNCTION__
à des fins de journalisation et de débogage?
Je suis principalement préoccupé par le fait de fournir à l'utilisateur des données trompeuses (par exemple, le fait de signaler le numéro de ligne ou la fonction incorrect à la suite d'une optimisation) ou de réduire les performances.
En fait, je peux faire confiance __FILE__
, __LINE__
et __FUNCTION__
à toujours faire la bonne chose?
c++
debugging
logging
c-preprocessor
Runcible
la source
la source
Réponses:
__FUNCTION__
n'est pas standard,__func__
existe en C99 / C ++ 11. Les autres (__LINE__
et__FILE__
) sont très bien.Il signalera toujours le bon fichier et la bonne ligne (et la fonction si vous choisissez d'utiliser
__FUNCTION__
/__func__
). L'optimisation est un non-facteur car il s'agit d'une expansion de macro au moment de la compilation; il n'affecter les performances en aucune façon.la source
__func__
est une sorte de problème en C ++. C99 ne dit pas un mot sur les arguments par défaut et ainsi de suite, des cas où il n'est pas si évident de savoir comment__func__
se comporter en C ++.__func__
existe en c99, pas en c ++. Quoi qu'il en soit, je pense qu'une implémentation raisonnable de__func__
en c ++ entraînerait simplement le nom mutilé. Puisque je ne suis pas un rédacteur de compilateur, ce n'est pas vraiment mon appel.__FUNCTION__
du tout? Quels compilateurs sauf gcc récent traitent cela comme une variable, pas comme une macro?__func__
est maintenant au standard C ++ 11.Dans de rares cas, il peut être utile de changer la ligne donnée par
__LINE__
autre chose. J'ai vu que GNU configure le fait pour certains tests pour signaler les numéros de ligne appropriés après avoir inséré du vaudou entre des lignes qui n'apparaissent pas dans les fichiers source d'origine. Par exemple:Les lignes suivantes commenceront par
__LINE__
100. Vous pouvez éventuellement ajouter un nouveau nom de fichierCe n'est que rarement utile. Mais si c'est nécessaire, je ne connais aucune alternative. En fait, au lieu de la ligne, une macro peut également être utilisée, ce qui doit entraîner l'une des deux formes ci-dessus. À l'aide de la bibliothèque de préprocesseurs boost, vous pouvez incrémenter la ligne actuelle de 50:
J'ai pensé qu'il était utile de le mentionner puisque vous avez posé des questions sur l'utilisation de
__LINE__
et__FILE__
. On n'a jamais assez de surprises en C ++ :)Edit: @Jonathan Leffler fournit d'autres bons cas d'utilisation dans les commentaires:
la source
Pour info: g ++ propose la macro non standard __PRETTY_FUNCTION__. Jusqu'à présent, je ne connaissais pas C99 __func__ (merci Evan!). Je pense que je préfère toujours __PRETTY_FUNCTION__ lorsqu'il est disponible pour la portée de la classe supplémentaire.
PS:
la source
Personnellement, je suis réticent à les utiliser pour autre chose que pour le débogage des messages. Je l'ai fait, mais j'essaie de ne pas montrer ce genre d'informations aux clients ou aux utilisateurs finaux. Mes clients ne sont pas des ingénieurs et ne maîtrisent parfois pas l'informatique. Je pourrais enregistrer ces informations sur la console, mais, comme je l'ai dit, à contrecœur, sauf pour les versions de débogage ou pour les outils internes. Je suppose que cela dépend de la clientèle que vous avez, cependant.
la source
C ++ 20
std::source_location
C ++ a finalement ajouté une option non-macro, et elle dominera probablement à un moment donné dans le futur lorsque C ++ 20 se généralisera:
La documentation dit:
où NTBS signifie "Chaîne d'octets terminée par une valeur nulle".
Je vais essayer quand le support arrivera à GCC, GCC 9.1.0 avec
g++-9 -std=c++2a
ne le supporte toujours pas.https://en.cppreference.com/w/cpp/utility/source_location l' utilisation des revendications sera comme:
Sortie possible:
__PRETTY_FUNCTION__
vs__FUNCTION__
vs__func__
vsstd::source_location::function_name
Réponse à: Quelle est la différence entre __PRETTY_FUNCTION__, __FUNCTION__, __func__?
la source
<experimental/source_location>
actuellement dans gcc-9.Je les utilise tout le temps. La seule chose qui m'inquiète est de donner l'adresse IP dans les fichiers journaux. Si vos noms de fonctions sont vraiment bons, vous pouvez rendre un secret commercial plus facile à découvrir. C'est un peu comme l'expédition avec des symboles de débogage, mais plus difficile à trouver. Dans 99,999% des cas, rien de mauvais n'en sortira.
la source
strings
utilitaire pour extraire toutes les données de type chaîne de l'exécutable. Même les exécutables compressés peuvent être extraits. Soyez très attentif à ce que vous envoyez à un site client. Souvent, les concurrents sont capables de mettre la main sur vos exécutables, même s'ils ne sont pas censés le faire.