L'utilisation d'une garde de préprocesseur est certainement l'approche la plus flexible et la plus courante. Cependant, lorsque cela est possible, je suggère d'utiliser une instruction if. Par exemple, au lieu de
void example(int a){
int some_local;
...
#ifdef _DEBUG
std::cout << "In function " << __FUNCTION__ << "(" << a <<")" << std::endl;
#endif
....
}
En supposant que ENABLE_DEBUG est défini comme étant 0 ou non nul, j'utiliserais
void example(int a){
int some_local;
...
if(ENABLE_DEBUG) std::cout << "In function " << __FUNCTION__ << "(" << a <<")" << std::endl;
...
}
Puisque ENABLE_DEBUG est une constante, lorsque ENABLE_DEBUG est 0, le compilateur ne génère aucun code pour les instructions qu'il garde. Alors, pourquoi utiliser cette méthode au lieu de #ifdef ?
- S'il y a de nombreuses déclarations de débogage distinctes réparties dans le code, la lecture peut être un peu plus aisée.
- Plus important encore, le code est toujours traité pour détecter les erreurs syntaxiques, même si aucun code n'est généré. Cela peut être très utile si le code de débogage n'est pas fréquemment activé. Si les variables changent (par exemple, dans l'exemple ci-dessus, si l'argument a a été renommé), la personne qui effectue le changement saura qu'elle doit également mettre à jour la déclaration de débogage. Si des #ifdefs sont utilisés, cela peut cacher un peu de pourriture jusqu'à ce que quelqu'un ait besoin d'activer le code de débogage et qu'il doive alors aller essayer de corriger le code, ce qui n'est pas forcément évident pour lui.
Évidemment, cette approche ne fonctionne que pour les déclarations de débogage à l'intérieur des corps de méthodes/fonctions.