Dites que j'ai une fonction C++ debugPrint (int foo). Comment est-ce que je peux le plus commodément dépouiller cela des versions de libération? Je ne veux pas entourer chaque appel à debugPrint aveC#ifdefs car cela prendrait beaucoup de temps. D'un autre côté, je veux être sûr à 100% que le compilateur supprime tous les appels à cette fonction, et la fonction elle-même à partir des versions libérées. L'effacement devrait également avoir lieu, s'il est appelé avec un paramètre résultant d'un appel de fonction. Par exemple, debugPrint (getFoo()) ;. Dans ce cas, je veux également que l'appel getFoo() soit supprimé. Je comprends que la fonction inline peut être une option, mais inline n'est pas garanti pour être pris en charge.Comment faire pour supprimer le code de débogage lors de la compilation en C++?
Répondre
Utiliser la compilation conditinal et une macro:
#ifdef _DEBUG
#define LOG(x) debugPrint(x)
#else
#define LOG(x)
#endif
Define _DEBUG
pour la version de débogage et définit pas pour la version release. Maintenant, dans la version construire chaque
LOG(blahbhahblah);
sera étendu dans une chaîne vide - même les paramètres ne seront pas évaluées et ne seront pas inclus dans le code émis.
Vous pouvez utiliser n'importe quel symbole de préprocesseur existant défini dans la version de débogage et non défini dans la version au lieu de _DEBUG
.
Oui, c'est exactement ce que les macros sont là pour !! – Newtopian
Ceci est dangereux et sujet aux erreurs. 'int x = 0; LOG (x + = 2); use (x); 'se comportera différemment si le mode" release "ou" debug "est activé. – LiraNuna
Oui, ce sera le cas. Rien ne vient gratuitement dans ce monde. – sharptooth
J'ai déjà fait quelque chose comme ça avec le préprocesseur.
#ifndef DEBUG
#define debugPrint
#endif
Essentiellement qui supprimera toutes les lignes de débogage
Err, ne serait-ce pas le valide 'debugPrintf ("bonjour"); dans le plutôt invalide '("bonjour");' ? – paxdiablo
@Pax, c'est parfaitement valide. – strager
Mais celui qui est susceptible de déclencher un avertissement. '(vide) (" bonjour ")' semble plus approprié. C'est faux, cependant: debugPrint (GetFoo()) appellera toujours GetFoo() avec cette macro, qui n'a pas été explicitement demandée. – MSalters
font de la ligne de fonction, et à l'intérieur de la fonction ont les #ifdef de, comme ceci:
inline void debugPrint(whatever_t wtvr)
{
#ifdef DEBUG
Logger::log(wtvr);
#endif
}
De cette façon, l'optimiseur dépouiller les fonction vide tout en gardant le code propre.
Est-ce que cela garantira que le paramètre de fonction ne sera pas évalué? – sharptooth
Cela ne va pas aider avec l'autre exigence (que s'il y a du code qui doit être évalué pour calculer wtvr ne sera pas généré non plus) –
@sharptooth, Ils doivent être évalués avec cette solution. Cependant, si l'évaluation modifie le fonctionnement du programme (c'est-à-dire les effets secondaires), le problème est que les appels à la fonction de journalisation peuvent faire plus que simplement se connecter. – strager
#ifdef _DEBUG
#define debugPrint(x) _debugPrint(x)
void _debugPrint(int foo) {
// debugPrint implementation
}
#else
#define debugPrint(x)
#endif
La réponse de @ sharptooth est bonne. Un changement mineur que je fais normalement, cependant, est de désactiver le débogage si le NDEBUG
macro est pas définie, plutôt que si un débogage macro est défini:
#ifndef NDEBUG
#define LOG(x) debugPrint(x)
#else
#define LOG(x)
#endif
Lorsque la NDEBUG
macro est définie, C assert
s, que j'ai tendance à utiliser assez libéralement pour affirmer des choses comme des conditions préalables et des post-conditions ou même pour aider à clarifier le résultat d'une logique complexe, abandonner aussi la compilation. C'est une macro standard pour "pas de débogage". Et, la macro NDEBUG
doit déjà être définie dans les versions de version.
Voir: http://www.opengroup.org/onlinepubs/009695399/functions/assert.html
- 1. Erreur de lieur lors de la compilation du code C++
- 2. Comment faire pour entrer dans la DLL C/C++ de l'application C# lors du débogage
- 3. ios :: nocreate erreur lors de la compilation d'un code C++
- 4. Comment faire pour supprimer le lecteur USB en utilisant C#
- 5. Comment configurer Eclipse pour ne pas supprimer le contenu du dossier classes lors de la compilation?
- 6. Comment faire pour supprimer une valeur de Registre en C#
- 7. Comment faire pour supprimer la propriété de répertoire Web IIS 6 en utilisant directoryentry en C#
- 8. Comment injecter du code C# au moment de la compilation?
- 9. Comment faire pour supprimer le dossier de compte d'utilisateur Windows en utilisant C#?
- 10. Comment faire pour modifier la langue de message d'exception Visual Studio en anglais pendant le débogage
- 11. Comment vérifier TR1 lors de la compilation?
- 12. Quelle est la meilleure façon d'isoler le code C «sale» du code propre lors de la compilation?
- 13. Pourquoi Visual Studio 2008 est-il bloqué en mode débogage lors de la compilation?
- 14. Comment faire pour supprimer le code de démarrage de session de XCode 3.2
- 15. Comment faire pour supprimer .xml et .json de l'URL lors de l'utilisation de la ressource active
- 16. Problème compilation du code modèle de C
- 17. Comment faire pour supprimer le bouton SIP de Windows Mobile
- 18. Comment afficher le code source dans le débogage lors de l'utilisation de .lib et dll
- 19. Comment faire valoir quelque chose à la compilation en Java?
- 20. Erreur lors de la compilation C++ fichier Dans GCC
- 21. Débogage et amélioration de l'efficacité C# winform code
- 22. L'optimisation et la génération d'informations de débogage font partie de la compilation ou de la liaison
- 23. Comment puis-je supprimer les avertissements (à l'échelle de la base de code) pendant la compilation de javadoc?
- 24. Comment faire pour supprimer le fond blanc de UITableViewCell
- 25. Comment faire pour supprimer QWidgets de QSplitter
- 26. Supprimer NULL, mais aucune erreur de compilation
- 27. Comment faire pour supprimer Type Erasure en Java
- 28. erreur de compilation dans le code ASP.NET lors de l'ajout d'un contrôle Literal
- 29. comment faire pour supprimer 503 exception dans C#
- 30. Comment faire pour supprimer li antérieur de la classe particulière?
La seule façon d'éliminer 'getFoo()' 'dans debugPrint (getFoo())' est d'utiliser macro. Mais cela conduira à ce que votre programme se comportera différemment dans les configurations de débogage et de libération. C'est vraiment dangereux. –
Il est dangereux si getFoo() a une logique cachée autre que l'obtention d'une valeur de foo variable. Mais c'est un mauvais code. – juvenis