Recent Posts
Recent Comments
Link
11-17 00:00
Today
Total
관리 메뉴

삶 가운데 남긴 기록 AACII.TISTORY.COM

MFC String 자료형 본문

DEV&OPS/C & C++

MFC String 자료형

ALEPH.GEM 2021. 9. 1. 18:06

MFC 문자열 처리

c언어와 c++ 에서는 string이라는 자료구조를 컴파일러 차원에서 지원하고 있지 않습니다.

(가장 많이 쓰는 자료구조형임에도 불구하고 옛날 언어라...)

그래서 c/c++에서는 string을 char 의 배열에 끝에 널문자(\0)를 넣어 포인터로 관리합니다.

 

Windows 에서는 이런 string처리를 위해 char* 를 대신해 

LPSTR, LPCSTR, LPTSTR, LPCTSTR , LPWSTR, LPCWSTR 

같은 자료형을 지원하고 있습니다.
(안그래도 불편한데 더 불편하게 만들었습니다. 
헝가리안 표기법의 유산이지요.)

그래서 이 암호같은 약자들의 뜻을 알아보도록 하겠습니다. 

 

LP는 long pointer  

16bit 시절 포인터는 모두 16bit였고 24bit 메모리를 long pointer를 extended memory 라는 이름으로 관리했었습니다만 현재 long pointer는 .NET에서는 64bit pointer, VC++6.0 이전 버전에서는 32bit pointer를 나타냅니다.

 

C는 constant 

상수 즉, 함수 내부에서 인자값을 변경하지 말라는 뜻입니다.

 

STR은 string

말그대로 문자열을 의미합니다.

 

W는 유니코드, 즉 wide char

windows9x에서 사용하던 multibyte와는 다르게 W가 있으면 unicode를 말합니다.

 

T는 t_char

윈도우는 전통적으로 한글을 처리할 때 멀티바이트 방식을 써왔습니다.

멀티바이트는 영어는1byte 한글은 2byte로 처리하는 방식을 말합니다.

그런데 char는 1byte고 유니코드는 2byte 이상 이므로 포인터 연산시  문제가 있습니다.

그래서 컴파일러가 precompile option을 보고 옵션에 따른 새로운 변수 모양의 Macro를 선언하게 되었습니다.

그것이 바로 TCHAR 입니다. 

매크로에서 #define을 하느냐 마느냐에 따라서 운영체제 multi-byte환경이면 char형으로 unicode환경이면 wide char형으로 type casting 됩니다.

MFC에서 지원하는 CString class는 LPCTSTR라는 함수를 통해서 일단 안전하게 const char * 형으로 바뀐 자료형을 얻어옵니다.


예를들어 (LPSTR)(LPCTSTR)myString 처럼 한번더 캐스팅해서 char* type으로  바꾸어 줍니다.


함수의 인자가 char * 인곳에 const char* 형을 넣으면 컴파일 오류가 발생하기 때문에 (LPSTR)을 한번더 앞에 써주어서 강제 type casting을 한 것입니다. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

DEV

 

728x90

'DEV&OPS > C & C++' 카테고리의 다른 글

kernel object and object handle  (0) 2021.09.10
windows 시스템 함수 호출 오류시 오류코드 획득  (0) 2021.09.07
Polymorphic 자료형  (0) 2021.09.03
C++ 문자열 처리(string class)  (0) 2021.09.01