2009-05-02 7 views
3

두 개의 타사 라이브러리를 사용하는 프로젝트가 있습니다. 두 프로젝트 모두 헤더 파일에 TCHAR을 사용합니다. 불행히도 한 라이브러리는 멀티 바이트 (라이브러리 a라고 부름)로 컴파일되고 다른 라이브러리는 유니 코드 (라이브러리 b라고 부름)로 컴파일됩니다.다른 문자 집합을 사용하는 라이브러리의 헤더 파일에서 TCHAR 처리

이제는 TCHAR이 빌드 옵션에 따라 wchar 또는 char이있는 사전 컴파일러로 대체된다는 것을 이해합니다. 따라서 라이브러리 a가 컴파일 될 때 TCHAR 유형의 매개 변수를 사용하는 모든 메소드는 char 유형의 매개 변수를 예상하도록 설정되고 라이브러리 b의 메소드는 wchar 유형의 매개 변수를 예상하도록 설정됩니다.

불행히도 내 소비 응용 프로그램도 문자 집합을 선택해야합니다. 유니 코드를 선택하면 라이브러리 a에 포함 된 헤더 파일에 메서드에 wchar이 필요하다는 메시지가 표시됩니다. 헤더에서 TCHAR을 컴파일 할 때 wchars로 해석되기 때문입니다. 여기에는 구조물 내부에 정의 된 TCHARS가 포함됩니다. 실제로이 동작을 확인했습니다. TCHAR 버퍼를 할당하고 전달할 때 멀티 바이트 데이터로 wchar 버퍼를 채우므로 가비지를 다시 가져옵니다.

내 질문은 : 같은 응용 프로그램에서 이러한 라이브러리를 모두 사용할 수있는 깨끗한 방법이 있습니까? 내가이 라이브러리를 어떻게 사용하고 있는지에 대해 뭔가 잘못된 생각을하고 있습니까?

답변

4

이 라이브러리 중 하나에서 너무 많은 클래스/함수를 사용하지 않는다고 가정하면 라이브러리 중 하나를 완전히 래핑합니다. 앱에서 mbc를 사용하고 라이브러리 b (유니 코드)를 랩핑하기로 결정한 경우 래퍼 헤더 파일은 TCHAR 대신 wchar_t을 사용할 수 있으므로 #define은 인터페이스에 영향을 미치지 않습니다. 래퍼의 cpp 파일에서 라이브러리 b 헤더를 #include하는 경우 라이브러리 #b와 일치하도록 #define TCHAR을 정의합니다. 랩퍼 이외의 코드는 라이브러리 b를 볼 수 없도록해야합니다.

두 라이브러리에서 둘 이상의 클래스/함수를 사용하는 경우 래퍼 코드를 유지 관리하는 것이 곧 문제가됩니다.

+0

답장을 보내 주셔서 감사합니다. 나는 그것이 기울고있는 방향입니다. 나는 사지에 가서 무엇이 바보 같은 질문 일지 물어볼 것입니다. 래퍼를 사용하는 것보다 라이브러리의 헤더 파일을 편집하는 것보다 구조와 내보내기 된 함수의 컴파일 된 정의와 일치하는 이점은 무엇입니까? 나는 이것이 TCHARs의 수색과 교체를하는 것만 큼 쉽다는 것을 상상하고 있습니다. 나는 그것을 단순화하고 있는가? – MichaC

+0

xtofl은 아래 장점 중 하나를 지적합니다. 래퍼에서 멀티 바이트로 변환하거나 멀티 바이트에서 변환 할 수 있습니다. find/replace가 작동하는지에 대한 피드백에 대부분 관심이 있다고 생각합니다. – MichaC

+2

라이브러리 헤더 파일에서 TCHAR을 char/wchar_t로 바꾸는 것은 라이브러리 헤더 파일에 #include를 통해 포함 된 헤더 파일을 포함하여 모든 파일을 교체하는 동안에 만 작동합니다. 라이브러리에 따라 일부 표준/시스템 파일이 포함될 수 있습니다. 다른 단점은 라이브러리의 새 버전을 구할 때 무엇입니까?다시 검색하고 바꾸시겠습니까? –

0

최선의 선택은 라이브러리 a 또는 라이브러리 b (이 예제에서는 라이브러리 a) 중 하나를 선택하는 것입니다. 그리고 라이브러리 b 헤더 파일을 포함 할 때 컴파일 된 라이브러리 b를 #define/# undef로 지정해야합니다. 그런 다음 동일한 데이터를 사용할 때마다 라이브러리 a와 라이브러리 b 사이를 변환해야합니다.

같은 방법으로 컴파일 할 수 있다면 정말 좋습니다. 그렇지 않으면 매우 지저분해질 것입니다.

1

Shing Yip으로 제안 했으므로 차이점을 자신의 API에 더 잘 래핑하십시오. 이것은 당신의 소스 코드를 독립적으로 만든다.

랩핑 API는 인코딩 된 문자를 라이브러리의 문자로 변환해야합니다. 창문에는 WideCharToMultiByte 등의 기능이 있습니다.