2010-07-23 6 views
14

Je sais que nous pouvons utiliseralternatif C++ perror()

perror() 

en C pour imprimer des erreurs. Je me demandais juste s'il y avait une alternative C++ à ceci, ou si je dois inclure ceci (et donc stdio.h) dans mon programme. J'essaie d'éviter autant de fonctions C que possible.

Merci!

+3

Pour ceux qui ne le savent pas, mais qui disent immédiatement "use' cerr' ", l'utilité de perror() est d'interpréter le' errno' et de l'afficher en conséquence. Je suppose qu'il veut l'interprétation tout autant que la sortie de la console ... – KevenK

+0

Pourriez-vous s'il vous plaît essayer d'expliquer comment vous voulez imprimer les erreurs? Les fonctions C sont également incluses dans C++, il n'y a rien de mal à les utiliser. – Simon

+2

Simon, l'une des raisons pour éviter les fonctions d'impression C-like dans les programmes C++ est que certains soins (rinçage) est nécessaire lors du mélange, par ex. 'printf' et' cout', voir http://stackoverflow.com/questions/2708482 –

Répondre

19

Vous pouvez faire quelque chose comme:

std::cerr << strerror(errno) << std::endl; 

qui finit toujours par appeler strerror, donc vous substituer vraiment juste une fonction C pour une autre. OTOH, il vous permet d'écrire via des flux, au lieu de mélanger les sorties C et C++, ce qui est généralement une bonne chose. Au moins AFAIK, C++ n'ajoute rien à la bibliothèque pour remplacer strerror (autre que générer un std::string, je ne suis pas sûr de ce qu'il changerait de strerror de toute façon).

+0

Une version C++ de 'strerror' qui retournerait un' std :: string' serait sans doute aussi thread-safe, ce qui serait un belle amélioration. –

+0

@Tyler: Eh bien, c'est certainement possible, et serait une amélioration pratique. OTOH, obtenir la sécurité du thread à partir de tout ce qui utilise 'errno' utilise presque inévitablement le stockage local du thread de toute façon (c'est-à-dire à peu près la même chose que pour sécuriser le thread' strerror'). –

+0

@Jerry Je ne suis pas sûr des autres frameworks de threads, mais les threads POSIX garantissent que 'errno' est automatiquement thread-local. Le problème avec 'strerror' est qu'il renvoie un pointeur vers un tampon statique qui n'est pas thread-local. –

2

Vous pouvez utiliser la classe boost::system_error::error_code.

#include <boost/system/system_error.hpp> 

#include <cerrno> 
#include <iostream> 

void 
PrintError(
     const std::string& message, 
     int error 
     ) 
{ 
    std::cerr << message << ": " << 
      boost::system::error_code(
       error, 
       boost::system::get_system_category() 
       ).message() 
      << std::endl; 
} 

int 
main() 
{ 
    PrintError("something went wrong!", EINVAL); 
    return 0; 
} 

est un peu trop compliqué, et quelque peu exagéré si vous n'utilisez pas déjà la bibliothèque boost_system.

+0

Cela ne serait-il pas mal si vous faites PrintError ("Nous avons épuisé de la mémoire! ", EINVAL); quand vous découvrez que vous n'avez pas réussi à faire une allocation de mémoire? – Simon

+0

Impossible d'utiliser la bibliothèque d'amplification. Cela doit être aussi "simple" (faute d'un meilleur terme) que possible. Essayer de ne pas inclure de trucs de tierce partie. Merci quand même! – Sagar

Questions connexes