Windows 자료형과 MBCS와 WBCS 호환
/*
* made by so_Sal
*/
모든 프로그램이 UNICODE 가 아니기 때문에
기존에 개발된 프로그램 호환성, UNICODE를 지원하지 못하는 운영체제
등 100% 유니코드로만 프로그램을 동작하도록 구현하지 않습니다.
그렇다면, Software를 개발할때
MBCS와 WBCS 2개 모두 개발하게 된다면 유지, 보수에 어려움이 2배가 되겠습니다.
그래서 MBCS, WBCS 모두 호환하게 되는 프로그램을 구현하는것으로 결론에 도달하게 되는데,
그래서 Windows에는 이를 해결시켜주는 메크로가 존재합니다.
#include<windows.h>에서 정의되어 있는 Windows 스타일의 자료형을 살펴보죠.
(WinString.cpp 자료 참조)
typedef char CHAR;
typedef wchar_t WCHAR;
#define CONST const
typedef CHAR* LPSTR;
typedef CONST CHAR* LPCSTR;
typedef WCHAR * LPWSTR;
typedef CONST WCHAR* LPCWSTR;
// const -> CONST :: windows 스타일의 자료형 이름이 대문자로
구성되는 흐름이기 때문에 대문자로 따라간다.
** MBCS와 WBCS를 동시에 지원하기 위한 메크로
#define UNICODE
#define _UNICODE
MBCS와 WBCS를 동시에 수용하는 형태의 프로그램을 구현하기 위한 메크로 정의
#ifdef UNICODE //UNICODE 메크로가 선언되어 있다면
typedef WCHAR TCHAR;
typedef LPWSTR LPTSTR;
typedef LPCWSTR LPCTSTR;
#else //UNICODE 메크로가 선언되어있지 않다면
typedef CHAR TCHAR;
typedef LPSTR LPTSTR;
typedef LPCSTR LPCTSTR;
#endif
TCHAR arr[10];
이것의 의미는.. 만약에
#define UNICODE 라는 메크로를 명시하였다면
WCHAR arr[10] :: WBCS가 되는것이고, (= wchar_t arr[10])
메크로가 명시되어있지 않는다면
CHAR arr[10] :: MBCS가 되게 됩니다. (= char arr[10])
(#include<tchar.h>에 선언된 내용이다.)
#ifdef _UNICODE
#define __T(x) L ## x
_UNICODE 메크로가 선언되어있을때,
__T("ABC") 이라면 -> L("ABC") 이렇게 붙여주란 뜻입니다.
#else
#define __T(x) x
하지만 _UNICODE가 선언되어있지 않을때에는
__T("ABC") 는 "ABC" 이것과 같게됩니다.
#endif
#define _T(x) __T(x)
#define _TEXT(x) __T(x)
_T(x) , __T(x) , _TEXT(x) 모두 같은의미 입니다. 특히 _T(x)를 많이 사용합니다.
노파심에, 한번 더 설명하자면
_T("windows"); 라고 선언되어 있을때,
메크로가 있다면
L"windows" 로 WBCS 기반으로 저장되고,
메크로가 없다면
"windows" 로 저장된다.
//// 위 예와 같이 MBCS와 WBCS를 메크로 유무에 따라서 사용할 수 있는데, 함수도 마찬가지이다.
#ifdef _UNICODE
#define _tmain wmain
#define _tcslen wcslen
#define _tcscat wcscat
#define _tcscpy wcscpy
#define _tcsncpy wcsncpy
#define _tcscmp wcscmp
#define _tcsncmp wcsncmp
#define _tprintf wprintf
#define _tscanf wscanf
#define _fgetts fgetws
#define _fputts fputws
#else
#define _tmain main
#define _tcslen strlen
#define _tcscat strcat
#define _tcscpy strcpy
#define _tcsncpy strncpy
#define _tcscmp strcmp
#define _tcsncmp strncmp
#define _tprintf printf
#define _tscanf scanf
#define _fgetts fgets
#define _fputts fputs
#endif
int main(int argc, char* argv[]) 처럼
매개변수를 받아오는 프로그램의 경우에
UNICODE로 받아오게 하려면
wmain 을 써야합니다.
하지만 이것도 역시
_tmain(int argc, TCHAR *argv[]) 로 나타낼 수 있습니다.
참고도서 : 윈도우즈 시스템 프로그래밍 | 윤성우 저 | 한빛미디어