Quelles sont les bonnes pratiques pour générer une sortie détaillée?
ce qui est une bonne pratique pour générer une sortie détaillée? actuellement, j'ai une fonction
bool verbose;
int setVerbose(bool v)
{
errormsg = "";
verbose = v;
if (verbose == v)
return 0;
else
return -1;
}
et chaque fois que je veux générer la sortie, je fais quelque chose comme
if (debug)
std::cout << "deleting interp" << std::endl;
cependant, je ne pense pas que c'est très élégant. donc, je me demande ce que ce serait une bonne façon de mettre en œuvre cette verbosité switch?
Doesnt votre
oui, à moins que quelque chose de très ésotérique qui se passe. c'est juste que j'ai un tas de setSomething() les fonctions qui tout retourne 0 si l'opération a été un succès et -1 sinon. donc, c'est juste une question d'avoir une interface cohérente ...
Je ne comprends pas ce code. Est-ce un cas de l'édition qui a mal tourné?
setVerbose
retourne toujours 0?oui, à moins que quelque chose de très ésotérique qui se passe. c'est juste que j'ai un tas de setSomething() les fonctions qui tout retourne 0 si l'opération a été un succès et -1 sinon. donc, c'est juste une question d'avoir une interface cohérente ...
Je ne comprends pas ce code. Est-ce un cas de l'édition qui a mal tourné?
OriginalL'auteur andreas-h | 2009-08-10
Vous devez vous connecter pour publier un commentaire.
La façon la plus simple est de créer de la petite classe comme suit(ici est la version Unicode, mais vous pouvez facilement le remplacer par un octet version):
Fonction d'assistance
log
a été faite de modèle pour obtenir de belles syntaxe d'appel. Ensuite, il pourrait être utilisé de la manière suivante:Vous pouvez changer de niveau de verbosité à l'exécution par l'évolution mondiale
GLOBAL_LEVEL
variable.Je trouve cette solution intelligente et très utile, je le souhaite, je peux lui donner 10 upvotes! 🙂
Je crois que le GLOBAL_LEVEL variable sera problématique à travers les unités de traduction, ai-je le droit? Comment voulez-vous mettre en œuvre cette variable?
OriginalL'auteur Kirill V. Lyadvinsky
Définir
log(x)
peut être facilement remplacé par fonction en ligne. Est-il nécessaire d'utiliser définit ici?Concernant std::endl: aucun, que je sache. Si vous voulez moins de code, vous pouvez toujours utiliser typedef, comme _e. Regardig #define/en ligne: pas de raison.
OriginalL'auteur Jonas Byström
Vous pouvez utiliser log4cpp
Je ne sais pas si c'est le cas ou non. désolé.
Je suis d'accord que l'utilisation d'une bonne bibliothèque de journalisation est la réponse plutôt qu'à la main-codage quelque chose, même si Log4cpp semble être moribond. logging.apache.org/log4cxx/index.html d'autre part, est bien vivante. Selon le site web, il n'a pas le support pour asynchrones journalisation, bien que je ne pense pas que ce soit pertinent pour cette question.
+1 pour ce qui suggère log4cxx, je l'avais oublié celui-là.
Ou log4cplus.
OriginalL'auteur Glen
Vous pouvez envelopper votre fonctionnalité dans une classe qui prend en charge la << opérateur qui permet de faire quelque chose comme
Ensuite, vous pouvez faire quelque chose comme
juste si je vous comprends bien: je voudrais créer une instance de la classe Trace appelé trace avant? et puis une autre question: pourquoi est-Trace::Activer assez pour mettre de l'état afin de Permettre? je suis encore assez novice en c++, et je suis un peu confus. peut-être certains trois lignes dans votre idée pourrait m'aider à mieux comprendre ce qu'il se passe. mais j'aime ton idée!
Oui, vous devez créer une instance de la classe Trace; ce pourrait être statique ou localement à chaque composant qui souhaite l'utiliser. La Trace::Activer ferait basculer un indicateur interne au sein de la classe Trace (une instance de l'état enum). Ce serait très bien comme std::hex permet std::cout de la sortie au format hex, au lieu de la virgule. Puisque vous allez être écrit de l'opérateur<< vous pouvez prendre en charge de Trace::Activer (ou tout autre état de prescripteurs tels que le niveau de verbosité et tel)
Andreash,
Trace::Enable
serait suffisant pour définir l'état deEnable
parce que vous allez écrire du code pour le<<
opérateur qui rend votre classe de savoir comment gérer ce drapeau. Il n'y a pas de magie ici. Personnellement, je voudrais faire un membre ordinaire de la fonction et de diretrace.enable()
.OriginalL'auteur ezpz
1. Si vous êtes à l'aide de g++, vous pouvez utiliser le flag-D, cela permet au compilateur de définir une macro de votre choix.
La définition de la
Par exemple :
2. Je suis d'accord ce n'est pas élégant, afin de le rendre un peu plus agréable :
Que vous pouvez utiliser comme printf :
3. Une troisième solution plus facile, et plus de C++ et Unix est de passer un argument à votre programme qui va être utilisé comme la macro tôt - à initialiser une variable particulière (qui pourrait être un global const).
Exemple :
$ ./myprogram -v
OriginalL'auteur MSI