쉽게 보면,
char* => LPSTR 라고 생각하면 되고
const char* => LPCSTR 라고 할 수 있다.
가운데 'C' 는 const 의 의미다. 'LP' 는 long pointer 의 의미.
끝에 STR 이라는 의미는 NULL 포인터로 끝난다는 의미. 즉, 마지막 인덱스에는 항상 NULL 이 채워져 있어야 한다는 것.
그래야만 str 관련 함수들이 동작을 하는 것이다. strlen, strcpy, strcmp 등등.. 이것들이 src param 의 끝에 NULL 이 없으면 무지 당황하게 된다.
가운데 'T' 가 들어간다는 것은 TCHAR 이라는 의미.
그렇다면 왜 T를 쓸까??
영문은 1바이트.
그런데, 우리나라 말이나, 중국어 등 영문권이 아닌 제 3세계 언어를 표현하기 위해서는
2바이트가 필요하다.. 이를 위해서 MultiByte 를 사용하기도 하지만 MultiByte 는
어떤 글씨는 1바이트 이고 어떤 글씨는 2바이트여서 메모리 관리가 어렵다.
그래서 나온 것이 wchar 인데,
wchar 는 모든 글씨(영문 포함)가 2바이트로 구성이 된다.
당연히 wchar 는 일반 ascii 타입의 char 보다 메모리 공간이 2배 필요하다.
그런데 본론인 TCHAR 는 무엇이냐?
바로 ACSCII 타입의 일반 char 또는 wchar 라는 의미다.
TCHAR 을 사용하면 char 인지 wchar 인지 구별하지 않고 그냥 코딩을 하면 된다.
TCHAR tch = _T('A'); <=> char ch = 'A';
TCHAR tch = _T('A'); <=> wchar wch = 'A';
배열도 역시.. 그냥 숫자 인덱스로 원하는 글씨의 위치를 추적할 수 있다.
그럼 무엇으로 현재 프로젝트의 TCHAR가 char 인지 wchar 인지를 구별할까?
UNICODE 라는 precompile 상수.
해당 프로젝트 project -> settings 에 _DEBUG 등등 선언되어 있는데, 끝에다
UNICODE 라고 쓰고 컴파일 하면 앞으로 나오는 모든 TCHAR 타입은 wchar 으로 변환해서
컴파일을 시도하게 된다.
T 앞의 C 는 const 라는 의미
당연히 상수로 변환을 했으므로 변수에 값을 대입할 수 없겠다.
( b[3] = _T('A'); <- syntax error <=> const char str = "ABCD"; str[3] = 'E' ; <- 이때 에러와 같은 이치)
(TCHAR 을 나타는 매크로가 _T 이다. (한문자 _T(' '), 문장 _T(" ") )
[출처: http://blog.naver.com/pengooni?Redirect=Log&logNo=100019565528]
===============================================================================
LPSTR : A 32-bit pointer to a character string.
이 데이터 형같은 경우 예전에 우리가 사용하던 방식으로 선언하면
char *
와 같은 경우이죠. 유니코드를 지원하지 않기 때문에 각각의
문자는 1바이트를 가집니다.
LPCSTR : A 32-bit pointer to a constant character string.
이 데이터 형같은 경우 예전에 우리가 사용하던 방식으로 선언하면
const char *
와 같은 경우이죠. const 형이 어떤건지는 아시죠? 이것역시
유니코드를 지원하지 않기 때문에 각각의 문자는 1바이트를 가집니다.
LPTSTR : A 32-bit pointer to a character string that is
portable for Unicode and DBCS
이 데이터 형같은 경우, 윈도우즈가 유니코드를 지원하면서 새로
생긴형식으로 풀어쓰면 다음과 같습니다.
TCHAR *
이 형은 유니코드를 지원하기 때문에 각 문자가 2바이트를 가지게
됩니다. 실제로 유니코드를 지원하는 프로그램을 작성하지 않는
이상 거의 사용하지 않습니다.
LPCTSTR : A 32-bit pointer to a constant character string that
is portable for Unicode and DBCS.
이것 역시 윈도우즈가 유니코드를 지원하면서 새로 생긴형식으로
풀어쓰면 다음과 같습니다.
const TCHAR *
마찬가지로 유니코드를 지원하기 때문에 한문자가 2바이트 크기를
가지게 됩니다.
함수뒤에 const 를 붙이는건 클래스 멤버함수내에서 this 사용을 제한하기 위해서 사용합니다.
일반적으로 멤버 함수내에서 사용되는 this는 해당 클래스가 MyClass 인 경우에,
MyClass * const this;
와 같이 내부적으로 선언되어서 사용되는데, 함수의 뒤에 const를 붙이면
const MyClass * const this;
와 같이 속성이 바뀌어져서 사용됩니다. 즉 내부에 사용되는 데이터 멤버가 이 함수에서는 모조리
읽기 전용으로 바뀌어져 버리는거죠…
this 변수가 가리키는 멤버들이 모두 쓰기 불능으로 되어버리기 때문에… 즉, this는 우리가 직접
변경할수 없기 때문에 함수뒤에 const를 붙여 간접적으로 this를 const형으로 변경하는 기능을
구현한겁니다.
'WORK > Sotfware' 카테고리의 다른 글
ini 형식의 파일을 읽고 쓰기 (0) | 2008.06.13 |
---|---|
_splitpath / 경로명에서 원하는 정보 분리하기 (0) | 2008.06.13 |
ASCII Code 표 / Hexa Code 표 / 아스키 / 핵사 (0) | 2008.06.09 |
그림으로 이해하는 포인터~! (0) | 2008.06.09 |
MS->Borland로 변경 (0) | 2008.06.09 |
댓글