본문 바로가기
Program

[Programming] (윈도우 시스템 프로그래밍) MBCS 와 WBCS 동시지원

by snwo 2020. 8. 9.

MBCS 와 WBCS 동시지원

MBCS 는 기존 작성된 프로그램과의 호환성, Unicode 를 지원하지 못하는 환경에서 프로그램을 동작시킬때와 같은 이유로, WBCS 의 장점에도 불구하고 WBCS 로만 프로그램을 작성할 수 없다.
서버프로그램은 문제가 되지 않는다. 서버는 업데이트가 편리하고. 개인에게 요구 하지 않기 때문이다.
기업을 대상으로 하는 프로그램은 WBCS기반 프로그래밍이 가능하다. 하지만 최종 클라이언트(유저) 고려하면, MBCSWBCS 동시지원하는 프로그램을 만드는게 좋다. 만약 MBCS, WBCS 기반의 프로그램을 각각 만든다면, 하나의 프로그램인데 두개가 존재하기때문에 하나바꾸면 다른 하나를 또 바꿔야하기때문에 유지보수가 어렵고, 배포하는과정에서도 문제가 나타난다.
이러한 이유로 MBCSWBCS 를 동시지원하는 프로그램을 구현하는것이 좋다고 할 수 있다.

윈도우에서는 이를 위한 다양한 매크로를 제공한다.

windows.h 에 windows 정의 자료형

typedef char	CHAR
typedef wchar_t	WCHAR

#define CONST	const

typedef CHAR*	LPSTR
typedef CONST CHAR*	LPCSTR
typedef WCHAR*	LPWSTR
typedef CONST WCHAR*	LPCWSTR

이렇게 자료형 네이밍은, 팀, 프로젝트, 회사 마다 다르게 할 수 도 있다. 선언된 자료형말고,

windows 의 typedef 선언 자체를 이해해야한다.

MBCS 와 WBCS 동시지원 매크로

#ifdef UNICODE
    typedef WCHAR	TCHAR;
    typedef LPWSTR	LPTSTR;
    typedef LPCWSTR	LPCTSTR;
#else
    typedef CHAR	TCHAR;
    typedef LPSTR	LPTSTR;
    typedef LPCSTR	LPCTSTR;
#endif
#ifdef _UNICODE
    #define __T(x)	L##x
#else
    #define __T(x)	x
#endif

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

이 부분을 보자.

#define __T(x)    L##x

여기에서 ##Lx 를 붙이라는것이다.


 example : __T("hello") -> L"hello"


_UNICODE 정의 여부에 따른 

example  :
_UNICODE 정의시 : _T("hello") -> __T("hello") -> L"hello"

정의되지 않았으면 : _T("hello") -> __T("hello") -> "hello"

 

 예제 :

#define UNICODE
#define _UNICODE
int wmain(void){
    TCHAR str[]=_T("123456");
    printf("%d",sizeof(str));
    return 0;
}

출력값은 wchar_t 문자열로 처리되어 14 가 나온다. (널문자도 2바이트 사용)

MBCS 와 WBCS 함수 동시지원하기위한 매크로

#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

_UNICODE 정의 여부에 따라 _tmainmain 또는 wmain 으로 치환된다.
MBCS 와 WBCS 를 동시지원할려면 앞에있는 함수( _tmain, _tcslen 등 ) 를 사용해야한다.

 

MBCS 와 WBCS 동시지원 프로그램 예시  :

int _tmain(void){
    LPTSTR str1=_T("hello");
    TCHAR str2[]=_T("hello");
    TCHAR str3[100];
    TCHAR str4[50];
    LPCTSTR pStr = str1;

    _tprintf(_T("string size %d length %d"),sizeof(str2),_tcslen(pStr));
    _fputts(_T("input please :"),stdout);
    _tscanf(_T("%s"),str3);
}

UNICODE 정의 시 자료형 설명 :
LPTSTR = wchar_t*
TCHAR = wchar
LPCTSTR = const wchar_t*

 

#윤성우 윈도우 시스템 프로그래밍을 BASE로 제작되었습니다.