2014-01-22 6 views
2

이전 프로젝트를 C++ Builder 2009에서 XE5로 포팅했습니다. 이전 프로젝트에서 유니 코드 문자열에 대한 컴파일러 옵션은 "_TCHAR : char"로 매핑되었습니다. 이것은 오래된 프로젝트에서 잘 작동했습니다.유니 코드 문자열 호환성 문제

포팅 할 때 XE5에서 동일한 컴파일러 옵션을 설정합니다. 하지만 여전히 같은 코드를 컴파일러 오류를 얻을 :

std::string str = String(some_component.Text).t_str(); 

이것은 다음과 같은 오류를 제공합니다 :

[bcc32 경고] file.cpp (89) : W8111 액세스가 기업 '유니 코드 스트링을 사용되지 않는 :: t_str() const를 '

[bcc32 오류] file.cpp (89) : E2285은 에 대한 일치하는 찾을 수 없습니다'= (wchar_t를 *) '

,369 :: 연산자 문자열을

그래서 분명히 XE5는 String::t_str()char*이 아닌 wchar_t*이되어야한다고 결정했습니다. 위에서 설명한대로 컴파일러 옵션을 설정해도 마찬가지입니다.

어떻게 해결할 수 있습니까?

저는 C++ Builder가 (2009 버전에서도) 내부적으로 유니 코드를 사용하는 단계를 밟았지만 200k LOC가있는 오래된 프로젝트입니다. 이를 유니 코드로 업데이트하는 것은 우선 순위가 매우 낮은 가파른 작업입니다.

편집

나는

std::string str = AnsiString(some_component.Text).c_str(); 

에 코드를 변경하여 작업을 얻을 수 있습니다 그러나 이것은 내가 많은 장소에서 코드를 변경해야 의미합니다. 코드 재 작성을 포함하지 않는 더 좋은 방법이 있습니까?

+0

#define String (a) AnsiString (a) – user1233963

답변

6

UnicodeString::t_str()은 CB2009에 처음 도입되었을 때 매핑 된 TCHAR에 따라 char* 또는 wchar_t* 중 하나를 반환했습니다. char*을 반환하기 위해 UnicodeString의 내부 데이터를 Ansi로 변경하여 (따라서 UnicodeString이 유니 코드 문자열 인 계약을 위반 함) 사람들이 유니 코드를 지원하기 위해 코드를 다시 작성하는 동안 마이그레이션 목적으로 임시로이 발생했습니다. RTL에 Ansi로 인코딩 된 UnicodeString (및 Unicode로 인코딩 된 AnsiString) 값을 처리하는 특수한 논리가 있었기 때문에이 오류가 발생했습니다. 그러나 이것은 위험한 코드였습니다. 몇 가지 버전을 출시 한 후 사람들이 마이그레이션 할 수있는 적절한 시간을 가졌을 때이 RTL 논리가 제거되었고 은 wchar_t*에만 고정되어 UnicodeString::c_str()과 일치했습니다. 더 이상 사용하지 마십시오 t_str()! 지금은 지원 중단으로 표시되어 있습니다. Ansi 데이터를 기대하는 무언가에 UnicodeString을 전달해야한다면, 중간 AnsiString으로 변환하는 것이 정확하고 안전한 방법입니다. 그것이 바로 지금의 방식입니다.

+0

좋아, 나는 캐스트를 AnsiString + c_str()으로 롤백하고 코드를 다시 작성해야한다고 생각한다. C++ 컴파일러가 C++ 표준 문자열과 100 % 호환되지 않는 내부 'String'유형을 가지고 있다는 것이 조금 이상합니다. C++ 11 또는 뭔가 wchar_t 함께 작동하도록 std :: string 다시? – Lundin

+1

Delphi의 네이티브'String','Char' 및'PChar' 타입과의 호환성을 위해 C++ Builder의'System :: String','System :: Char' 및'System :: PChar' 별칭이 존재합니다.CB2009에서는 'UnicodeString','wchar_t' 및'wchar_t *'에 각각 매핑됩니다. 이전 버전에서는 대신'AnsiString','char','char *'에 매핑되었습니다. 그들은 C++ STL과 아무 관련이 없습니다. 다른 프레임 워크, 다른 유형. STL'std :: string' 타입은 여전히'char'을 사용합니다. 'wchar_t'의 경우 대신'std :: wstring'을 사용하십시오 (C++ 11은 새로운'std :: u16string'과'std :: u32string' 타입을 추가합니다). –