I'm FanJae.

[SYSTEM PROGRAMMING] MBCS와 WBCS 동시 지원 본문

System Programming

[SYSTEM PROGRAMMING] MBCS와 WBCS 동시 지원

FanJae 2024. 9. 3. 22:30

1. MBCS와 WBCS 동시지원

1-1. 동시 지원의 필요성과 Windows 스타일 자료형

- 프로그램 구현시 여러 측면을 고려해야한다. 

- 기존 개발된 프로그램과의 호환성 및 사용자 시스템에서 지원하지 못하는 경우로 인해 유니코드로만 동작 시킬 수 없다.

 

typedef char             CHAR;
typedef wchar_t         WCHAR;

#define CONST           const;

typedef CHAR *          LPSTR;
typedef CONST CHAR *   LTCSTR;

typedef WCHAR *        LPWSTR;
typedef CONST WCHAR * LPCWSTR;

- Windows에서는 typedef 키워드를 통하여 몇몇 기본 자료형에 Window 스타일의 새로운 이름을 정의하고 있다.

- 이는 WinString.cpp안에 모두 있다.

 

#include <stdio.h>
#include <windows.h>

int main(int argc, wchar_t* argv[])
{
    LPSTR str1 = "SBCS Style String 1";
    LPWSTR str2 = L"WBCS Style String 1";
    
    CHAR arr1[] = "SBCS Style String 2";
    WCHAR arr2[] = L"WBCS Style String 2";
    
    LPCSTR cStr1 = arr1;
    LPCWSTR cStr2 = arr2;
    
    printf("%s\n", str1);
    printf("%s\n", arr1);
    
    wprintf(L"%s\n", str2);
    wprintf(L"%s\n", arr2);
    
    return 0;
}

- 이와 같은 형태로 되어있다.

- 코드 자체는 복잡하지 않아서 이해하는데 무리가 없다.

 

2. MBCS와 WBCS 동시 지원 매크로

#ifdef _UNICODE
   typedef WCHAR       TCHAR;
   typedef LPWSTR      LPTSTR;
   typedef LPCWSTR     LPCTSTR;
#else
   typedef CHAR        TCHAR;
   typedef LPSTR       LPTSTR;
   typedef LPCSTR      LPCTSTR;
#endif

- _UNICODE가 정의되어 있는가 정의 되어있지 않은가로 판단하는 것이다.

- _UNICODE가 정의되어 있지 않다면

TCHAR arr[10];은 -> CHAR arr[10] -> char[10]; 순으로 바뀐다.

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

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

- 유니코드가 정의되어 있을때 L ## x 부분은 -> __T("ABC")라고 할때 이를 -> L"ABC"와 같은 형태로 바꾸어준다.

 

- 유니코드 지원여부에 따라서 다음과 같이 처리가 가능하다.

Comments