_MBCS 코드와 TCHAR.H 데이터 형식 사용
매니페스트 상수가 _MBCS
정의되면 지정된 제네릭 텍스트 루틴이 다음 종류의 루틴 중 하나에 매핑됩니다.
멀티바이트 바이트, 문자 및 문자열을 적절하게 처리하는 SBCS 루틴. 이 경우 문자열 인수는
char*
형식이어야 합니다. 예를 들어_tprintf
는printf
에 매핑되고printf
에 대한 문자열 인수는char*
형식입니다. 문자열 형식에 대해_TCHAR
일반 텍스트 데이터 형식을 사용하는 경우_TCHAR*
이char*
에 매핑되므로printf
에 대한 형식 및 실제 매개 변수 형식은 일치합니다.MBCS 관련 루틴. 이 경우 문자열 인수는
unsigned char*
형식이어야 합니다. 예를 들어_tcsrev
는unsigned 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
형식에 매핑합니다. 제네릭 텍스트 매크로에 대한 자세한 내용은 런타임 라이브러리 참조의 제네릭 텍스트 매핑을 참조하세요.