다음을 통해 공유


_MBCS 코드와 TCHAR.H 데이터 형식 사용

매니페스트 상수가 _MBCS 정의되면 지정된 제네릭 텍스트 루틴이 다음 종류의 루틴 중 하나에 매핑됩니다.

  • 멀티바이트 바이트, 문자 및 문자열을 적절하게 처리하는 SBCS 루틴. 이 경우 문자열 인수는 char* 형식이어야 합니다. 예를 들어 _tprintfprintf에 매핑되고 printf에 대한 문자열 인수는 char* 형식입니다. 문자열 형식에 대해 _TCHAR 일반 텍스트 데이터 형식을 사용하는 경우 _TCHAR*char*에 매핑되므로 printf에 대한 형식 및 실제 매개 변수 형식은 일치합니다.

  • MBCS 관련 루틴. 이 경우 문자열 인수는 unsigned char* 형식이어야 합니다. 예를 들어 _tcsrevunsigned char* 형식의 문자열을 사용하고 반환하는 _mbsrev에 매핑됩니다. 문자열 형식에 _TCHAR 제네릭 텍스트 데이터 형식을 사용하는 경우 형식에 매핑되므로 형식 충돌이 _TCHAR 발생할 수 있습니다 char.

이러한 형식 충돌(및 이로 인한 C 컴파일러 경고 또는 C++ 컴파일러 오류)을 방지하기 위한 방법으로는 다음 세 가지가 있습니다.

  • 기본 동작을 사용합니다. tchar.h는 다음 예제와 같이 런타임 라이브러리의 루틴에 대한 일반 텍스트 루틴 프로토타입을 제공합니다.

    char * _tcsrev(char *);
    

    기본 사례에서 프로토타입은 _tcsrev Libc.lib의 thunk를 _mbsrev 통해 매핑됩니다. 그러면 들어오는 매개 변수 및 나가는 반환 값의 _mbsrev 형식이 (즉, char *)에서 _TCHAR* .로 unsigned char *변경됩니다. 이 메서드는 사용할 _TCHAR때 형식 일치를 보장하지만 함수 호출 오버헤드로 인해 상대적으로 느립니다.

  • 코드에서 다음 전처리기 문을 통합하여 함수 인라인을 사용합니다.

    #define _USE_INLINING
    

    이 메서드를 사용하면 tchar.h에 제공된 인라인 함수 thunk가 제네릭 텍스트 루틴을 적절한 MBCS 루틴에 직접 매핑합니다. tchar.h에서 발췌한 다음 코드는 이 작업을 수행하는 방법의 예를 제공합니다.

    __inline char *_tcsrev(char *_s1)
    {return (char *)_mbsrev((unsigned char *)_s1);}
    

    인라인을 사용할 수 있는 경우 형식 일치가 보장되고 추가적으로 시간이 소요되지 않으므로 최선의 방법입니다.

  • 코드에 다음 전처리기 문을 통합하여 직접 매핑을 사용합니다.

    #define _MB_MAP_DIRECT
    

    기본 동작을 사용하지 않으려고 하거나 인라인을 사용할 수 없는 경우 이 방법이 가장 빠른 대안입니다. 이렇게 하면 제네릭 텍스트 루틴이 tchar.h의 다음 예제와 같이 매크로에서 직접 MBCS 버전의 루틴에 매핑됩니다.

    #define _tcschr _mbschr
    

    이 방법을 사용하는 경우 문자열 인수 및 문자열 반환 값에 적절한 데이터 형식을 사용하도록 주의해야 합니다. 형식 캐스팅을 사용하여 적절한 형식 일치를 보장하거나 _TXCHAR 일반 텍스트 데이터 형식을 사용할 수 있습니다. _TXCHAR은 SBCS 코드의 char 형식을 MBCS 코드의 unsigned char 형식에 매핑합니다. 제네릭 텍스트 매크로에 대한 자세한 내용은 런타임 라이브러리 참조의 제네릭 텍스트 매핑을 참조하세요.

참고 항목

tchar.h의 제네릭 텍스트 매핑