Sablog Models/플랫폼·툴킷

MS 컴파일러의 문자/문자열 자료형

어­리 2011. 7. 25. 22:38

Windows에서는 문자/문자열 처리를 위해 특별한 자료형과 예약된 정의를 사용할 수 있다. C언어에서 char 형에는 1바이트 ASCII (+ 2바이트 코드 페이지) 문자가 저장되는 반면 wchar에는 유니코드 문자가 2바이트 기준으로 저장된다. BMP 밖은 대강대강 처리한다.

이것에 신경쓰지 않을 수 있는 타입이 t_char (TCHAR)이다. 매크로 확장은 컴파일러와 옵션에 따라 결정된다.

변수 상수 (L"...")
1B/확장 문자열 유니코드(2B) 문자열 1B/확장 문자열 유니코드(2B) 문자열
플랫폼 대응 문자열 플랫폼 대응 문자열
char * wchar * const char * const wchar *
t_char * const t_char *
PSTR / LPSTR PWSTR / LPWSTR PCSTR / LPCSTR PCWSTR / LPCWSTR
PTSTR / LPTSTR PCTSTR / LPCTSTR

조합에서 공통적으로 보이는 문자들은 다음의 두문자어이다.

  • L: long
  • P: pointer
  • C: const
  • W: wide
  • T: t_char
  • STR: char * (string)

윈도우 16비트 호환 API에서는 PSTR을, 32비트에서는 LPSTR을 쓴다. LPTSTR 또는 LPCTSTR의 식별자 헝가리안 헤드는 STR을 sz로 쓰는 관습에 의해 lpsz 또는 psz일 때가 많은데, 어차피 STR은 포인터이기 때문에 (PSTR이라고 이중 포인터가 아니다) 그냥 sz로 쓰기도 한다. 함수에 대해서도 main/wmain, print/wprintf 등에 대해 _tmain, _tprintf 등이 정의되어 있다. tchar.h 참고.

참고로 비주얼 스튜디오 최신을 사용하고 있고 관련 설정을 건드리지 않았다면, TCHAR를 썼을 때 WCHAR이 아닌 CHAR로 확장되는 경우는 드물다. 그럼에도 불구하고 만약 WCHAR로 확장되지 않았다면 이 프로그램은 유니코드를 지원하기는 사실상 글러먹은 프로그램이 된다.