Tchar.h의 제네릭 텍스트 매핑
국제적으로 사용할 수 있도록 코드 전송을 단순화하기 위해 Microsoft 런타임 라이브러리는 많은 데이터 형식, 루틴 및 기타 개체에 대해 Microsoft 고유의 제네릭 텍스트 매핑을 제공합니다.Tchar.h에 정의되는 이러한 매핑을 사용하여 제네릭 코드를 작성할 수 있으며, 이러한 제네릭 코드는 #define 문을 사용하여 정의하는 명시적 상수에 따라 싱글바이트, 멀티바이트 또는 유니코드 문자 집합에 맞게 컴파일됩니다.제네릭 텍스트 매핑은 ANSI와 호환되지 않는 Microsoft 확장입니다.
Tchar.h를 사용하면 동일한 소스로부터 싱글바이트, MBCS(멀티바이트 문자 집합) 및 유니코드 응용 프로그램을 빌드할 수 있습니다.Tchar.h는 _tcs 접두사가 있는 매크로를 정의하며, 이 매크로는 전처리기 정의가 올바를 경우 str, _mbs 또는 wcs 함수에 적절하게 매핑됩니다.MBCS를 빌드하려면 _MBCS 기호를 정의합니다.유니코드를 빌드하려면 _UNICODE 기호를 정의합니다.싱글바이트 응용 프로그램을 빌드하려면 기본적으로 아무 것도 정의하지 않습니다.MFC 응용 프로그램의 경우 기본적으로 _MBCS가 정의됩니다.
_TCHAR 데이터 형식은 Tchar.h에서 조건부로 정의됩니다.빌드에 대해 _UNICODE 기호를 정의하면 _TCHAR는 wchar_t로 정의됩니다. 싱글바이트 빌드와 MBCS 빌드의 경우에는 char로 정의됩니다.기본 유니코드 와이드 문자의 데이터 형식인 wchar_t는 부호 있는 8비트 char의 16비트 형식입니다. 국가별 응용 프로그램에서는 바이트 단위가 아니라 _TCHAR 단위로 작동하는 _tcs 함수 패밀리를 사용합니다.예를 들어, _tcsncpy는 n 바이트가 아니라 n_TCHARs를 복사합니다.
일부 SBCS(싱글바이트 문자 집합) 문자열 처리 함수는 (부호 있는) char* 매개 변수를 사용하기 때문에 _MBCS가 정의되면 형식이 일치하지 않는다는 컴파일러 경고가 표시됩니다.다음과 같은 세 가지 방법으로 이 경고를 방지할 수 있습니다.
Tchar.h에 형식이 안전한 인라인 함수 썽크를 사용합니다.이것은 기본적인 동작입니다.
명령줄에서 _MB_MAP_DIRECT를 정의하여 Tchar.h에 직접 매크로를 사용합니다.이 경우 수동으로 형식을 일치시켜야 합니다.속도가 가장 빠른 방법이지만 형식이 안전하지 않습니다.
Tchar.h에 형식이 안전한 정적 링크 라이브러리 함수 썽크를 사용합니다.이렇게 하려면 명령줄에서 상수 _NO_INLINING을 정의합니다.속도가 가장 느린 방법이지만 형식은 가장 안전합니다.
일반 텍스트 매핑을 위한 전처리기 지시문
#define |
컴파일 버전 |
예제 |
---|---|---|
_UNICODE |
유니코드(와이드 문자) |
_tcsrev가 _wcsrev로 매핑 |
_MBCS |
멀티바이트 문자 |
_tcsrev 가 _mbsrev로 매핑 |
없음(기본값: _UNICODE와 _MBCS 모두 정의되지 않음) |
SBCS(ASCII) |
_tcsrev가 strrev로 매핑 |
예를 들어, Tchar.h에 정의되는 일반 텍스트 함수인 _tcsrev는 프로그램에 _MBCS가 정의된 경우 _mbsrev로 매핑되고, _UNICODE가 정의된 경우 _wcsrev로 매핑됩니다.그렇지 않으면 _tcsrev가 strrev로 매핑됩니다.간편하게 프로그래밍할 수 있도록 Tchar.h에 다른 데이터 형식 매핑도 제공되지만 _TCHAR가 가장 유용합니다.
제네릭 텍스트 데이터 형식 매핑
제네릭 텍스트 데이터 형식 이름 |
_UNICODE 및 _MBCS가 정의되지 않음 |
_MBCS 정의됨 |
_UNICODE 정의됨 |
---|---|---|---|
_TCHAR |
char |
char |
wchar_t |
_TINT |
int |
unsigned int |
wint_t |
_TSCHAR |
signed char |
signed char |
wchar_t |
_TUCHAR |
unsigned char |
unsigned char |
wchar_t |
_TXCHAR |
char |
unsigned char |
wchar_t |
_T 또는 _TEXT |
적용 안 됨(전처리기에서 제거) |
적용 안 됨(전처리기에서 제거) |
L(다음 문자 또는 문자열을 해당 유니코드로 변환) |
루틴, 변수 및 기타 개체에 대한 제네릭 텍스트 매핑의 목록을 보려면 Run-Time Library Reference의 제네릭 텍스트 매핑을 참조하십시오.
[!참고]
유니코드 문자열과 str 함수 패밀리를 함께 사용하지 마십시오. 포함 Null 바이트가 들어 있을 수 있습니다.마찬가지로 MBCS(또는 SBCS) 문자열과 wcs 함수 패밀리를 함께 사용하지 마십시오.
다음 코드 부분은 MBCS, 유니코드 및 SBCS 모델에 매핑하기 위한 _TCHAR 및 _tcsrev의 사용에 대해 설명합니다.
_TCHAR *RetVal, *szString;
RetVal = _tcsrev(szString);
_MBCS가 정의되어 있으면 전처리기는 다음 부분을 코드에 매핑합니다.
char *RetVal, *szString;
RetVal = _mbsrev(szString);
_UNICODE가 정의되어 있으면 전처리기는 다음 부분을 코드에 매핑합니다.
wchar_t *RetVal, *szString;
RetVal = _wcsrev(szString);
_MBCS와 _UNICODE가 모두 정의되지 않았으면 전처리기는 다음과 같이 해당 부분을 싱글바이트 ASCII 코드에 매핑합니다.
char *RetVal, *szString;
RetVal = strrev(szString);
따라서 사용자는 세 종류의 문자 집합 중 하나와 관련된 루틴을 사용하여 실행할 단일 코드 파일을 작성, 유지 관리 및 컴파일할 수 있습니다.