LISTORY

[윈도우즈 시스템 프로그래밍] MBCS와 WBCS의 동시지원 본문

IT/윈도우 프로그래밍

[윈도우즈 시스템 프로그래밍] MBCS와 WBCS의 동시지원

LiStoryTeller 2018. 5. 12. 19:29


뇌를 자극하는 윈도우즈 시스템 프로그래밍 책 관련 유투브 강의에 대한 정리이다.


이번 차수는 저번 포스팅에서 다른 MBCS와 WBCS를 동시 지원하는 법에 대한 강의이다.


YouTube 주소 ⊙ ☞ MBCS와 WBCS의 동시지원





MBCS와 WBCS의 동시지원


세상에 모든 시스템이 유니코드를 지원하면 좋겠지만 그렇지 않기에 동시에 지원할 수 있게 하는 편이 좋다.


이를 할 수 있도록 하기 위해 윈도우는 다양한 매크로를 지원한다.


◎ #include <windows.h> 안에는 ...


typedef char          CHAR;

typedef wchar_t     WCHAR;


#define CONST        const


typedef CHAR *                    LPSTR;

typedef CONST CHAR *       LPCSTR; 


typedef WCHAR *                 LPWSTR;

typedef CONST WCHAR *    LPCWSTR;


물론, 직접 자료형을 정의해도 된다.



◎ MBCS와 WBCS 동시 지원 매크로


#ifdef UNICODE

typedef WCHAR          TCHAR;

typedef LPWSTR         LPTSRT;

typedef LPCWSRT      LPCTSTR;

#else

typedef CHAR             TCHAR;

typedef LPSTR            LPTSTR;

typedef LPCSTR         LPCTSTR;

#endif


즉, TCHAR a 라고 선언을 하였을 때, 유니코드가 선언이 되있으면 TCHAR는 WCHAR가 되고 선언이 되있지 않다면 CHAR가 되는 것이다.


매크로 UNICODE를 정의했냐에 따라 해당 문자열이 char가 되거나 wchar_t가 된다.


즉, 두 모드를 동시에 지원하는 것이다.


그렇다면 유니코드 문자열 앞에 L을 붙여야 하는 것은 동시에 어떻게 처리할 수 있을까?


#ifdef _UNICODE

#define __T(x)    L## x

#else

#define __T(x)    x

#endif


#define     _T(x)            __T(x)

#defifne    _TEXT(x)     __T(x)


_UNICODE 매크로를 정의해서 이런 식으로 사용할 수 있다.


예를 들어 _T("TEST"); 문자열을 선언하였을 때, 매크로 _UNICODE가 정의되어 있다면 이는 L"TEST"가 되고 정의되어 있지 않다면 그냥 "TEST"가 될 것이다. 



또 한가지 더 신경쓸 것이 있다.


WBCS와 MBCS에 따라 쓰는 함수들이 다르다.


다행히 다음과 같은 선언이 windows.h에 포함되어 있다.


#ifdef _UNICODE

#define            _tmain    wmain

#define            _tcslen    wcslen

#define            _tprintf    wprintf

#define            _tscanf    wscanf

#else

#define            _tmain    main

#define            _tcslen    strlen

#define            _tprintf    printf

#define            _tscanf    scanf

#endif


어떤 Character Set이냐 신경쓰지 않고 그냥 _tmain등을 사용하면 된다.


그렇다면 WBCS와 MBCS를 동시에 지원하는 프로그램이 된다.






Comments