'프로그래밍/c++'에 해당되는 글 15건

  1. 2013.06.20 USES_CONVERSION
  2. 2013.06.18 c++ 천단위마다 콤마(,) 찍기
프로그래밍/c++2013. 6. 20. 17:37

필자에게 몇일전 MAX SDK 8 으로 제작된 플러그인을 MAX SDK 2013에 맞게 수정을 해야 되는 작업이 들어왔습니다.

SDK 버전업이 되면서 클래스라던지 함수라던지 구조가 바뀌는건 해당 레퍼런스 찾아서 수정하면 간단하게 해결이 되는건데 가장 큰문제는

 

Unicode - 3ds Max now compiles with Unicode.

 

이 한줄 이였습니다.

 

기존의 우리 프로젝트가 멀티바이트를 기반으로하여 만들어져 있는데다 MAX SDK 8 로 제작했었던 플러그인도 멀티바이트를 기반으로 만들어져 있어

문자 집합을 멀티바이트에서 유니코드로 변경을 해야 되는 상황이 생겼습니다.

프로젝트 설정에서 멀티바이트 -> 유니코드로 변경하고 빌드를 돌리는 순간 엄청난 양의 컴파일 에러들....

기존 소스중 char 형으로 되어있는 소스들을 모두 TCHAR 혹은 wchar_t 형으로 변경해야 되나 고심을 하다가 알게된

USES_CONVERSION 이라는 매크로.

 

간단히 설명하자면 UNICODE <-> MBCS(MultiBtyeCharacterSet) 로 바꿔주는 문자열 변환 매크로 입니다.

사용 방법은 #include <atlconv.h> 와 같이 atlconv.h 파일을 인클루드 해주고

변환하고자 하는 문자열이 포함된 함수내에서 상단에 USES_CONVERSION 매크로를 정의한후 바꾸고자 하는 문자열에 맞춰 아래 처럼 캐스팅하면 됩니다.

 

ex) 사용방법

USES_CONVERSION;


wchar_t* widechar = L"unicode";
char* ansichar;


ansichar= W2A(widechar);

 

 

// 제공하는 변환 매크로들

A2CW (LPCSTR) -> (LPCWSTR)
A2W (LPCSTR) -> (LPWSTR)
W2CA (LPCWSTR) -> (LPCSTR)
W2A (LPCWSTR) -> (LPSTR)

T2COLE (LPCTSTR) -> (LPCOLESTR)
T2OLE (LPCTSTR) -> (LPOLESTR)
OLE2CT (LPCOLESTR) -> (LPCTSTR)

 

※ 사용시 유의 사항!!

USES_CONVERSION 매크로는 내부적으로 매크로가 호출된 시점에서 변환될 문자열의 길이값만큼 동적메모리를 할당후 변환된 문자열을 리턴해줍니다.

함수가 끝나는 시점에서는 할당했던 동적메모리를 해제하기때문에 리턴하기전에 캐스팅을 하면 쓰레기값밖에 리턴이 되지 않습니다.

 

ex) 잘못된 예

wchar_t * GetCharConversion( char* _szInput )

{

USES_CONVERSION;

return A2W( szInput);

}

 

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

ps. TCHAR에 대한 부가 설명.

TCHAR는 말그대로 char형을 typedef로 재정의한 데이터유형 입니다.

프로젝트 설정에서 문자집합을 유니코드로 변경하면 전처리기에 UNICODE 와 _UNICODE가 추가되는 것을 볼수있을 것 입니다.

TCHAR를  추적하여 tchar.h 파일을 살펴 보면

#ifdef UNICODE라면 typedef wchar_t TCHAR

#ifdef _MBCS 라면 typedef char            TCHAR

와 같은 소스를 볼수 있을것입니다.

프로젝트에 설정에 따라서 TCHAR형은 컴파일단계에서 char형이 될수도 wchar_t 형이 될수도 있는 것 입니다.

국내에서만 사용하는 프로그램이라면 굳이 위와같이 문자열 타입을 신경쓰지 않아도 되지만

혹여 다른 여러국가에 사용하게 될 프로그램이라면 프로젝트 설정에서 꼭 유니코드 기반으로 설정하고 프로젝트를 시작하길 권합니다...

간단하게 설명하자면 MBCS로 모든 나라의 언어를 표현할수 없기때문이고 자세한 정보는 MBCS 때문에 개고생을 하고나면 자연스레 알게 되시리라 봅니다 ㅋ



Posted by GaePein
프로그래밍/c++2013. 6. 18. 12:25

ANSI C++도 Java 처럼 천단위 콤마 찍기를 지원합니다.
표준 라이브러리의 locale 클래스를 사용하면 됩니다.

 

std::string sep_thousands(double f)
{
    using namespace std;

    const char *locale_name =
    #ifdef WINDOWS
    "korean";
    #endif
   
    ostringstream oss;
    oss.imbue(locale(locale_name));
    oss << f;
    return oss.str();
}


로케일을 한국어나 영어로 설정하면 자동으로 천단위 컴마 찍기가 됩니다.
(소숫점 이하는 찍히지 않습니다.)
만약 독일어로 설정하면 컴마(,) 대신 피리어드(.)가 찍힙니다.

 

출처 : http://kldp.org/node/38269



Posted by GaePein