배고픈 개발자 이야기
[MFC] 문자열 변수에 대하여 본문
MFC에서 문자열을 사용하면 CString, LPSTR, LPCSTR, LPCTSTR, LPCWSTR처럼 다양한 자료형이 있다.
C언어를 쓸때는 String또는 char*만 쓰다가 MFC로 넘어오니 이상한 변수들이 있다.
개발을 하려면 저게 어떤건지 좀 명확하게 확인하고 넘어가고 싶어 풀네임부터 알아보았다.
CString = LPCTSTR = const t_char*
LPSTR = Long Pointer String = char*
LPCSTR = Long Pointer Constant String = const char*
LPCTSTR = Long Pointer Constant T_String = const t_char*
LPCWSTR = Long Pointer Constant Wide String = const w_char*
풀네임을 보니 대략적인 변수의 뜻을 알것같다..
char *, const char *은 알겠는데 t_char*, w_char*는 뭐하는 놈인가 구글링해봤더니
이런 windows 역사부터 설명이나온다.. 설명인 즉,
마이크로소프트사가 unicode기반으로 windows를 개발하다가
환경에 따라 다른 자료형인 char(1바이트), wide char(2바이트)의 호환성을 맞춰주기 위해,
(포인터 연산이 많은 C언어에서 동일 변수의 호환성이 맞지 않는것은 매우 치명적이다)
컴파일러가 precompile옵션을 보고 운영체제 환경에 맞게 변수 모양을 새롭게 작성해주는 Macro를 만들게 된다.
그 Macro가 바로 t_char라는 변수라는 것이었다.
이 Macro는 자신의 운영체제가 multi-byte 환경이면, char형으로,
unicode환경이면, w_char형으로 자동 type casting 을 해주게 된다.
변수에 대한 의문이 생기게 된 계기로
MFC에서 파일경로를 CString으로 입력받아 char*형태의 파라미터로 넘겨주게 될때면 (LPSTR)(LPCTSTR) 형변환을 하라는 컴파일러 메시지를 보고나서부터이다.
형병환을 보기좋게 바꿔보면 (char *)(const char *)와 같은 말이라는것이다.
굳이..? 왜? 이렇게 형병환을 할까 하면 CString 자료형 때문이라고 한다.
그냥 char *로만 형변환하면 CString변수의 자료형 표현을 위한 앞으 16바이트값이 바뀌기 때문에
이상한 값으로 치환된다는것, 그래서 const char *로 값을 갖고 와서 char *로 또다시 변환해 줘야 한다고 한다.
MFC는 뭔가 something special한 언어인것 같다.
'언어 > C언어, C++언어' 카테고리의 다른 글
[MFC] WndProc 메시지 처리 함수 (1) | 2020.04.28 |
---|---|
[C++] Mutex & Semapore & Dead Lock (2) | 2020.04.24 |
[C언어] 문자열에 변수 합치기 (feat. 반복문) (0) | 2020.03.24 |
[리눅스] 주기적으로 실행해야하는 프로그램 (crontab) (0) | 2020.03.06 |
[C/C++] error while loading shared libraries : cannot open shared object file: No such file or directory (0) | 2020.03.06 |