LISTORY
[윈도우즈 시스템 프로그래밍] MBCS와 WBCS의 동시지원 본문
뇌를 자극하는 윈도우즈 시스템 프로그래밍 책 관련 유투브 강의에 대한 정리이다.
이번 차수는 저번 포스팅에서 다른 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를 동시에 지원하는 프로그램이 된다.
'IT > 윈도우 프로그래밍' 카테고리의 다른 글
[윈도우즈 시스템 프로그래밍]프로그램 구현 관점에서의 WIN32 vs WIN64 (0) | 2018.05.18 |
---|---|
[윈도우즈 시스템 프로그래밍] WIN32 vs WIN64 (0) | 2018.05.15 |
[윈도우즈 시스템 프로그래밍] Windows에서의 유니코드(UNICODE) (0) | 2018.05.12 |
[윈도우즈 시스템 프로그래밍] 프로그램의 실행과정/하드웨어 구성의 재접근 (0) | 2018.05.12 |
[윈도우즈 시스템 프로그래밍] 컴퓨터 구조에 대한 이야기 (1) | 2018.05.12 |