2010-07-23 25 views
14

So che possiamo usareC++ alternativa al perror()

perror() 

in C per stampare gli errori. Mi stavo chiedendo se c'è un'alternativa C++ a questo, o se devo includere questo (e quindi stdio.h) nel mio programma. Sto cercando di evitare quante più funzioni C possibili.

Grazie!

+3

Per coloro che non lo sanno, ma immediatamente dicono "usa' cerr' ", l'utilità di' perror() 'è che in realtà interpreta l'errore e lo visualizza di conseguenza. Presumo che voglia l'interpretazione tanto quanto l'output della console ... – KevenK

+0

Potresti provare a spiegare come vuoi stampare gli errori? Anche le funzioni C sono incluse in C++, non c'è niente di sbagliato nell'usarle. – Simon

+2

Simon, uno dei motivi per evitare le funzioni di stampa simili a C nei programmi C++ è che è necessario prestare attenzione (risciacquo) durante la miscelazione, ad es. 'printf' e' cout', vedi http://stackoverflow.com/questions/2708482 –

risposta

19

Si potrebbe fare qualcosa di simile:

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

che finisce ancora per chiamare strerror, in modo che stai davvero solo sostituendo una funzione C per un altro. OTOH, ti permette di scrivere tramite stream, invece di mixare output C e C++, che generalmente è una buona cosa. Almeno AFAIK, C++ non aggiunge nulla alla libreria per fungere da sostituto per strerror (oltre a generare un std::string, non sono sicuro che cosa cambierebbe comunque da strerror).

+0

Una versione C++ di 'strerror' che restituirebbe' std :: string' sarebbe presumibilmente anche thread-safe, che sarebbe un bel miglioramento. –

+0

@Tyler: Beh, questo è certamente possibile e sarebbe un miglioramento pratico. OTOH, per ottenere sicurezza da tutto ciò che usa 'errno' usa quasi inevitabilmente la memorizzazione locale dei thread (cioè, all'incirca lo stesso che serve per rendere sicuro il thread' strerror'). –

+0

@Jerry Non sono sicuro di altri framework di threading, ma i thread POSIX garantiscono che 'errno' è thread-local automaticamente. Il problema con 'strerror' è che restituisce un puntatore a un buffer statico che non è thread-local. –

2

È possibile utilizzare 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; 
} 

è un po 'prolisso e un po' eccessivo se non si utilizza già la libreria boost_system.

+0

Non sarebbe male se ti capita di fare PrintError ("Abbiamo finito di memoria! ", EINVAL); quando scopri di non aver eseguito un'allocazione di memoria? – Simon

+0

Impossibile effettivamente utilizzare la libreria boost. Questo deve essere il più semplice possibile (per mancanza di un termine migliore). Cercando di non includere materiale di terze parti. Grazie comunque! – Sagar