2010-07-23 21 views
14

Sé que podemos utilizaralternativa C++ para pError()

perror() 

en C para imprimir errores. Me preguntaba si existe una alternativa C++ a esto, o si tengo que incluir esto (y por lo tanto stdio.h) en mi programa. Estoy tratando de evitar tantas funciones C como sea posible.

Gracias!

+3

Para aquellos que no lo sepan, pero inmediatamente digan "use' cerr' ", la utilidad de' perror() 'es que realmente interpreta el' errno' y lo muestra en consecuencia. Supongo que quiere la interpretación tanto como la salida de la consola ... – KevenK

+0

¿Podría explicar cómo quiere imprimir los errores? Las funciones C también se incluyen en C++, no hay nada de malo en usarlas. – Simon

+2

Simon, una de las razones para evitar las funciones de impresión tipo C en los programas C++ es que se necesita cierto cuidado (enjuague) al mezclar, p. 'printf' y' cout', vea http://stackoverflow.com/questions/2708482 –

Respuesta

19

Se podría hacer algo como:

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

Eso todavía termina llamando strerror, por lo que está realmente sólo la sustitución de una función C para otro. OTOH, te permite escribir a través de transmisiones, en lugar de mezclar las salidas C y C++, que generalmente es algo bueno. Al menos AFAIK, C++ no agrega nada a la biblioteca para actuar como sustituto de strerror (aparte de generar un std::string, no estoy seguro de qué cambiaría de strerror de todos modos).

+0

Una versión en C++ de 'strerror' que devolvería un' std :: string' probablemente también sería segura para subprocesos, que sería una buena mejora. –

+0

@Tyler: Bueno, eso es ciertamente posible, y sería una mejora práctica. OTOH, al sacar el hilo de seguridad de todo lo que utiliza 'errno' casi inevitablemente utiliza el almacenamiento local de subprocesos de todos modos (es decir, casi lo mismo que se necesita para hacer que el subproceso' strerror' sea seguro). –

+0

@Jerry No estoy seguro acerca de otros frameworks de threading, pero los hilos POSIX garantizan que 'errno' sea thread-local automáticamente. El problema con 'strerror' es que devuelve un puntero a un buffer estático que no es thread-local. –

2

Puede usar la clase 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; 
} 

es un poco prolijo, y algo exagerado si no está utilizando la biblioteca boost_system.

+0

¿No sería bastante malo si haces PrintError ("Nos quedamos sin de memoria! ", EINVAL); cuando descubres que no has hecho una asignación de memoria? – Simon

+0

No se puede usar la biblioteca de impulso. Esto tiene que ser tan 'simple' (por falta de un término mejor) como sea posible. Tratando de no incluir cosas de terceros. ¡Gracias! – Sagar