2010-07-23 4 views
14

나는 우리가 오류를 인쇄 C에C++ 대안은()

perror() 

을 사용할 수 있습니다 알고 perror는합니다. C++에 대한 대안이 있는지 또는 내 프로그램에이 (따라서 stdio.h)를 포함해야하는지 여부는 궁금합니다. 가능한 한 많은 C 함수를 피하려고합니다.

감사합니다. 아직도 당신이 정말 또 다른 하나 개 C의 기능을 대체하고, 그래서 strerror를 호출 끝

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

:

+3

'cerr'을 사용하라'는 것을 모르는 사람들을 위해,'perror() '의 유용성은 실제로'errno'를 해석하여 적절하게 표시한다는 것입니다. 나는 그가 콘솔 출력만큼 ​​해석을 원한다고 가정합니다 ... – KevenK

+0

어떻게 오류를 인쇄하고 싶은지 설명해 주시겠습니까? C 함수는 C++에도 포함되어 있습니다. 사용하는 데는 문제가 없습니다. – Simon

+2

Simon, C++ 프로그램에서 C와 같은 인쇄 기능을 피하는 이유 중 하나는 혼합 할 때주의 (플러싱)가 필요하다는 것입니다. 'printf'와'cout'은 http://stackoverflow.com/questions/2708482를 참조하십시오. –

답변

19

당신이 뭔가를 할 수 있습니다. OTOH를 사용하면 C 및 C++ 출력을 믹싱하는 대신 스트림을 통해 작성할 수 있습니다. 일반적으로 좋은 방법입니다. 적어도 AFAIK, C++은 strerror을 대신 할 라이브러리에 아무것도 추가하지 않습니다 (std::string을 생성하는 것 외에는 어쨌든 strerror에서 무엇이 변경 될지 확실하지 않습니다).

+0

std :: string을 리턴하는'strerror'의 C++ 버전은 아마도 thread-safe가 될 것입니다. 좋은 개선. –

+0

@ 타일러 : 글쎄, 그건 분명 가능하고, 편리한 개선이 될 것입니다. OTOH,'errno '를 사용하는 것에서 스레드 안전성을 얻는 것은 어쨌든 (즉,'strerror' 스레드 안전성을 확보하는 것과 거의 같은) 스레드 로컬 저장소를 거의 불가피하게 사용합니다. –

+0

@Jerry 다른 스레딩 프레임 워크에 대해서는 잘 모르겠지만 POSIX 스레드는'errno'가 자동으로 스레드 로컬이라는 것을 보장합니다. 'strerror '문제는 스레드 로컬이 아닌 정적 버퍼에 대한 포인터를 반환한다는 것입니다. –

2

boost::system_error::error_code 클래스를 사용할 수 있습니다. 이미 boost_system 라이브러리를 사용하지 않는 경우

#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; 
} 

는 태드 자세한, 다소 과잉이다.

+0

PrintError를 할 일이 그렇게 심하지 않을까요? " 기억의 "!, EINVAL); 메모리 할당을하지 못한 것을 발견했을 때? – Simon

+0

실제로 부스트 라이브러리를 사용할 수 없습니다. 이것은 가능한 한 '보통'(보다 나은 용어가 부족하기 때문에)해야합니다. 타사 물건을 포함하지 않으려 고합니다. 그래도 고마워! – Sagar

관련 문제