Windows_/Windows_C# & App

Windows 자료형과 MBCS와 WBCS 호환

sosal 2014. 7. 24. 09:59
반응형

/*

 * http://sosal.kr/

 * 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[]) 로 나타낼 수 있습니다.

참고도서 : 윈도우즈 시스템 프로그래밍 | 윤성우 저 | 한빛미디어