2012-07-14 4 views
3

저는 현재 사용하고있는 API와 동일한 perror()을 구현하고 있습니다.perror() 구현 - 문제

perror는()의 표준 ISO C doc 말한다 :

perror는() 함수는 표준 오차 스트림의 방향을 변경하지 않는다.

프로그래밍 방식으로는 무엇을 의미합니까?

현재 fprintf(stderr, ..)을 사용하고 있습니다. 실수로 그것을 사용합니까? 사실이라면 왜? 내 구현에 오류가있는 경우 (아래 참조), 제게는 점수를주십시오. 내 해석을 기반으로

체크 아웃 내 C 코드 :

각 C 스트림은 재산이
void 
fooapi_perror(const char *s) 
{ 
    char *emsg; 

    if(s != NULL && *s != '\0') 
    fprintf(stderr, "%s: ", s); 

    emsg = fooapi_strerror(GetLastErrorCode()); 
    fprintf(stderr, "%s\n", emsg); 
    free(emsg); 
} 
+0

재미있는 점은 ISO C 표준이 아닌 POSIX 표준에 대한 것입니다. ISO/IEC 9899 : 1999의 사본은 당신이 쿼리 한 라인을 제외하고는 링크 된 것과 거의 동일합니다! – cdarke

+0

질문의 제목을'... perror() - issue'라는 조용한 일반 표현에서'... perror() : output stream orientation'과 같이 좀 더 구체적으로 수정하고 싶을 것입니다. 후자는'perror()'구현 그 자체에 관한 것이다. – alk

답변

9

- 제 1 동작에 의해 결정된다 "방향을"중 "와이드 지향"또는 "바이트 지향을" 이 증기에. 스트림에 방향이 없으면 방향을 변경할 수 있습니다. 방향이 스트림의 방향과 충돌하는 함수를 호출하면 정의되지 않은 동작이 발생합니다.

예를 들어 printf는 증기가 바이트 지향이되고 wprintf는 증기가 와이드 지향이됩니다.

질문과 관련하여, 페어는 스트림의 방향을 변경해서는 안됩니다.

코드에서 사용하는 페어에 이미 방향이있는 경우 방향이 스트림의 현재 방향과 충돌하는 함수를 호출하지 않아야합니다.

3

fwide(3)을 사용하여 스트림의 방향을 결정한 다음이를 사용하여 fprintf 또는 fwprintf으로 전화 할 것인지 결정할 수 있습니다.

void 
fooapi_perror(const char *s) 
{ 
    const char *emsg = fooapi_strerror(fooapi_geterrcode()); 

    if (fwide(stderr, 0) <= 0) { 
     // byte-oriented or not yet oriented 
     if (s && *s) 
      fprintf(stderr, "%s: %s\n", s, emsg); 
     else 
      fprintf(stderr, "%s\n", emsg); 
    } else { 
     // wide-oriented 
     if (s && *s) 
      fwprintf(stderr, L"%s: %s\n", s, emsg); 
     else 
      fwprintf(stderr, L"%s\n", emsg); 
    } 

    free(emsg); 
} 

참고 :이 일치하지 않는,이 스트림을 -orient 해제 할 수있는 방법이 없기 때문에 스트림이 아직 방향을 취득하지 않은 경우 요구 사항 "스트림 방향을 변경하지 않는다"도 스트림에 방향을 지정하지 않고 출력을 보낼 수있는 방법이 있습니까? The GNU libc implementation of perror이 경우에는 더러운 해킹에 빠져 있습니다 (기본 파일 설명자 복제)! "표준 C 와이드 문자 지원은 어쨌든 목적에 맞지 않습니다."

접두어 키보츠 : fooapi_strerrorfree d가되어야하는 포인터가 아니라 문자열 상수에 대한 포인터를 반환해야합니다.