Tchar.h의 제네릭 텍스트 매핑
국제적으로 사용할 수 있도록 코드 전송을 단순화하기 위해 Microsoft 런타임 라이브러리는 많은 데이터 형식, 루틴 및 기타 개체에 대해 Microsoft 고유의 제네릭 텍스트 매핑을 제공합니다. Tchar.h에 정의되는 이러한 매핑을 사용하여 제네릭 코드를 작성할 수 있으며, 이러한 제네릭 코드는 #define 문을 사용하여 정의하는 명시적 상수에 따라 싱글바이트, 멀티바이트 또는 Unicode 문자 집합에 맞게 컴파일됩니다. 제네릭 텍스트 매핑은 ANSI와 호환되지 않는 Microsoft 확장입니다.
Tchar.h를 사용하면 동일한 소스로부터 싱글바이트, MBCS(멀티바이트 문자 집합) 및 Unicode 응용 프로그램을 빌드할 수 있습니다. Tchar.h는 _tcs 접두사가 있는 매크로를 정의하며, 이 매크로는 전처리기 정의가 올바를 경우 str, _mbs 또는 wcs 함수에 적절하게 매핑됩니다. MBCS를 빌드하려면 _MBCS 기호를 정의합니다. Unicode를 빌드하려면 _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 |
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(다음 문자 또는 문자열을 해당 Unicode로 변환) |
루틴, 변수 및 기타 개체에 대한 제네릭 텍스트 매핑의 목록을 보려면 Run-Time Library Reference의 Generic-Text Mappings을 참조하십시오.
참고
유니코드 문자열과 str 함수 패밀리를 함께 사용하지 마십시오. 포함 Null 바이트가 들어 있을 수 있습니다. 마찬가지로 MBCS(또는 SBCS) 문자열과 wcs 함수 패밀리를 함께 사용하지 마십시오.
다음 코드 부분은 MBCS, Unicode 및 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);
따라서 사용자는 세 종류의 문자 집합 중 하나와 관련된 루틴을 사용하여 실행할 단일 코드 파일을 작성, 유지 관리 및 컴파일할 수 있습니다.