2010-07-23 8 views
14

Wiem, że możemy użyćC++ alternatywą perror()

perror() 

w C do wydrukowania błędów. Zastanawiam się tylko, czy istnieje alternatywa C++ do tego, czy muszę uwzględnić to (i dlatego stdio.h) w moim programie. Staram się unikać tak wielu funkcji C, jak to możliwe.

Dzięki!

+3

Dla tych, którzy nie wiedzą, ale od razu po prostu powiedz "użyj' cerr' ", przydatność' perror() 'polega na tym, że faktycznie interpretuje' errno' i wyświetla je odpowiednio. Zakładam, że chce interpretacji tak samo jak wyjście konsoli ... – KevenK

+0

Czy możesz spróbować wyjaśnić, jak chcesz drukować błędy? Funkcje C są również zawarte w C++, nie ma nic złego w ich używaniu. – Simon

+2

Simon, jednym z powodów unikania funkcji drukowania w języku C w programach w C++ jest to, że niektóre uwagi (płukanie) są potrzebne podczas mieszania, np. 'printf' i' cout', zobacz http://stackoverflow.com/questions/2708482 –

Odpowiedz

19

Można zrobić coś takiego:

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

To nadal kończy się wywołaniem strerror, więc jesteś naprawdę tylko zastępując jedną funkcję C na inny. OTOH, pozwala pisać przez strumienie, zamiast mieszania wyjściowego C i C++, co jest ogólnie rzeczą dobrą. Co najmniej AFAIK, C++ nie dodaje nic do biblioteki, aby działać jako substytut dla strerror (inne niż generowanie std::string, nie jestem pewien, co by to zmieniło z strerror).

+0

Wersja 'strerror' napisana w C++, która zwróciłaby' std :: string', prawdopodobnie byłaby również wątkowo bezpieczna, co oznaczałoby miła poprawa. –

+0

@Tyler: Cóż, to na pewno możliwe i przydałaby się poprawa. OTOH, zabezpieczanie wątków przed wszystkim, co używa 'errno', niemal nieuchronnie używa w dalszym ciągu lokalnej pamięci wątku (tj. W przybliżeniu tak samo, jak robi to 'strerror' wątku bezpiecznego). –

+0

@Jerry Nie mam pewności co do innych struktur wątków, ale wątki POSIX gwarantują, że 'errno' jest automatycznie wątkiem lokalnym. Problem z 'strerror' polega na tym, że zwraca wskaźnik do statycznego bufora, który nie jest wątkiem lokalnym. –

2

Można użyć klasy 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; 
} 

To odrobinę gadatliwa i nieco przesadzona, jeśli jeszcze nie korzystasz z biblioteki boost_system.

+0

Czy nie byłoby tak źle, gdybyś zrobił PrintError ("Wyszliśmy pamięci! ", EINVAL); kiedy odkryjesz, że nie udało Ci się dokonać alokacji pamięci? – Simon

+0

Nie można faktycznie użyć biblioteki boost. To musi być jak najprostsze (z braku lepszego terminu). Staram się nie uwzględniać żadnych treści innych firm. W każdym razie dzięki! – Sagar

Powiązane problemy