본문 바로가기
프로그래밍/운영체제

c/c++ TCHAR 정리.

by Hwan2 2019. 12. 29.
728x90
반응형

 

 

 

 

요즘은 문자를 처리할 때 유니코드를 주로 사용합니다. WBCS라고 하며 모든 문자와 숫자를 2바이트로 처리합니다.

 

모든 프로그램이 유니코드를 사용하면 좋겠지만.... 실상은 아니죠.

 

초창기, 문자열 처리는 아스키코드로 사용해왔고, 아스키 코드는 1바이트로 구성됩니다.

 

그리고 초창기부터 사용되어 왔던 아스키코드를 지금도 사용하고 있죠.

 

C/C++에선 유니코드를 사용함에 따라 문자열 처리를 1바이트와 2바이트 이 두개를 신경써서 해야 했고,

 

결론적으로 유니코드를 처리할 수 있는 자료형을 만들어 냅니다.

 

바로 앞에 w를 붙인 자료형이죠.

 

아래 자료형 선언은 <Windows.h> 헤더파일에 정의되어 있습니다.

(정확히 말하자면 winnt.h에 있지만 이 해더파일을 Windows.h가 포함하고 있습니다.)

char = 1바이트
wchar_t = 2바이트
 

wchar_t로 선언된 char형은 2바이트로 처리하게 됩니다.

 

하지만 MS에선 이 자료형들에 대해 일관성을 부여하기위해 typedef를 사용해 대문자로 사용합니다.

char -> CHAR
wchar_t -> WCHAR
 

 

char 를 대문자인 CHAR

wchar_t 를 대문자인 WCHAR로 말이죠.

 

따라서 아스키코드를 사용하는 프로그램은 CHAR를 사용하면 되고

유니코드를 사용하는 프로그램은 WCHAR를 사용하면 됩니다.

 

 

 

그러면 상수 문자열은 어떻게 처리해야 할까요??

예를들자면 이런거 말입니다.

char arr[] = "hi my name";
printf("안녕하세요?\n");

 

이런 문자열들은 상수로 선언된 것입니다. 이것들은 기본적으로 1바이트로 구성되어 있죠.

따라서 프로그래머는다음 키워드를 통해 2바이트로 바꿔줘야 합니다.

 

char arr[] = L"hi my name";
printf(L"안녕하세요?\n");
 

 

문자열 앞에 'L'을 붙여주는 것이죠. 이렇게 하면 해당 문자열은 2바이트로 처리가 됩니다.

 

 

 

하지만 여기서 불편한 점이 생김니다.

 

아스키코드로 사용된 프로그램이 유니코드를 사용해야 한다면.....

혹은 유니코드로 사용된 프로그램이 아스키코드를 사용해야 한다면....

 

똑같은 프로그램을 유니코드용과 아스키코드용으로 만들어야 합니다.

즉, 2개의 프로그램이 필요한 것이죠.

 

이러한 점 때문에 MS에선 한가지 방법은 고안해 냅니다.

 

전처리 함수를 통해 유니코드일 땐 WCHAR로 변환해서 사용하고 아스키코드일땐 CHAR로 변환해서 사용하는 것입니다.

 

컴파일러의 설정에 따라서 말이죠.

 

즉, 프로그래머는 사용환경에 맞춰 컴파일 빌드만 바꿔주면 아스키코드용 프로그램이 만들어지고

유니코드용 프로그램이 만들어 지는 것입니다.

 

그리고 이를 정의하 전처리 함수는 다음과 같습니다.

#ifdef UNICODE
    typedef WCHAR TCHAR;
#else
    typedef CHAR TCHAR;
#endif
 

 

 

TCHAR로 통일하는 것입니다. 

(다른 자료형들도 많이 있지만(LPTSTR, LPCTSTR 등) 생략했습니다.)

 

그리고 상수로 표현하는 문자열의 처리도 다음과 같이 정의되어 있습니다.

#ifdef _UNICODE
    #define __T(x) L ## x
#else
    #define __T(x) x
#endif

#define _T(x)        __T(x)
#define _TEXT(x)     __T(x)
 

 

따라서 문자열 앞에 '_T'를 붙여주면 컴파일 환경에 따라 문자열을 처리할 수 있게 됩니다.

그리고 이걸 사용하기 위해선 <tchar.h> 헤더 파일을 선언해 줘야합니다.

 

보통은 <Windows.h>와 <tchar.h> 요 두를 동시에 선언하는게 보편적입니다.

 

 

 

 

반응형

댓글


스킨편집 -> html 편집에서