2013년 12월 18일 수요일

[Win32/MFC] "", L"", TEXT(""), _T("") 차이점

Visual C++에서 문자 처리는 2가지가 있다.
"멀티바이트"와 "유니코드"다.
(C#은 유니코드만 있는걸로 알고 있음)

멀티바이트(MBCS=Multi Byte Character Set): 영어는 1바이트, 그 외 문자는 2바이트로 처리.
유니코드(WBCS=Wide Byte Character Set): 모든 문자를 2바이트로 처리.(참고로 GCC는 4바이트로 처리)

그래서 Visual Studio에서 프로젝트 속성을
멀티바이트로 하면 "" 이렇게 문자를 입력하고
유니코드로 하면 L"" 이렇게 문자를 입력해야 한다.
ex)
멀티바이트일때 MessageBox( NULL, "a", "b", MB_OK );
유니코드일때    MessageBox( NULL, L"a", L"b", MB_OK );

근데 유니코드로 설정 후 개발 했다가
멀티바이트로 변경 해야될때(외부 라이브러리와의 호환성 등)
L"" 이렇게 입력한 부분을 모두 찾아서
"" 이렇게 변경을 해줘야 한다.(완전 노가다)

그래서 TEXT("")와 _T("")를 #define 했다.
ex)
MessageBox( NULL, TEXT("a"), TEXT("b"), MB_OK );
이렇게 입력을 하면
멀티바이트일때 MessageBox( NULL, "a", "b", MB_OK );
유니코드일때    MessageBox( NULL, L"a", L"b", MB_OK );
이렇게 변환이 되어서 컴파일 된다.

TEXT("")과 _T("")의 차이점은
TEXT("")는 WinNT.h에서 #define했고
_T("")는 tchar.h에서 TEXT가 4글자라서 _T이렇게 2글자로 #define했다.

즉 Win32에서는 TEXT("")를 쓰고 MFC에서는 _T("")를 사용한다.
Win32에서 _T("")를 사용하고 싶으면 tchar.h를 추가하면 되고
MFC에서는 당연히 TEXT("")도 사용 가능하다.

--- 결론
윈도우즈 프로그램 개발시
문자를 "" 또는 L"" 이렇게 입력하지 말고
TEXT("") 또는 _T("") 이렇게 입력하자.

댓글 2개: