2017-11-14 23 views
5

Poco::Path와 작업 매우 흥미로운 오류가 발견되었습니다. (Windows에서)입니다Poco :: Path는 const wchar_t *로 컴파일되지만 예기치 않게 작동합니다.

#include <iostream> 
#include <string> 
#include <Poco/Path.h> 

int main() 
{ 
    std::wstring a_path = L"c:\\temp"; 

    //Poco::Path from_wstring(a_path); // ERROR: fails to compile, expected 
    Poco::Path from_wchar_t(a_path.c_str()); // compiles... unexpected 

    std::cout << from_wchar_t.toString() << std::endl; 

    return 0; 
} 

그러나 위의 프로그램의 출력 :

C :

대신 예상의

\ 다음 코드를 참조하십시오 : \ temp

Poco::Path 설명서를 검토 한 결과 (즉, 첫 번째 경로가 실패한 이유)이나 const wchar_t* (예상치 : std::stringconst char* (모두 UTF-8))을 예상하는 생성자가 없습니다.

const wchar_t*으로 컴파일하는 이유와 예기치 않은 출력 (잘못된 경로)이있는 이유는 무엇입니까?

답변

4

이 질문에 mvce을 만들면 문제가 발생했습니다. 다른 사람들에게 도움이 될 수 있도록 여기에 문서화하기로 결정했습니다.

질문에 표시된 코드는 내가 컴파일 경고 실종됐다 거대한 프로젝트의 일부입니다

경고 C4800 : 'const를 같이 wchar_t *': 값을 강제하는 것은 '사실'또는 '거짓 bool로하기를 '(성능 경고)

그렇다면 생성자 Poco::Path::Path(bool absolute)이 있다는 것을 알고 컴파일러는 자동으로 포인터를 캐스팅하여 예기치 않은 동작을 발생시키는 것으로 나타났습니다. 출력의 \은 비어있는 절대 경로, 즉 해당 생성자를 사용할 때의 초기 값에 해당합니다. 나중에 참조 할 수 있도록

#include <boost/locale/encoding.hpp> 
// ... 
std::wstring a_path = L"c:\\temp"; 
Poco::Path utf8_path(boost::locale::conv::utf_to_utf<char>(a_path)); 
+1

: 해결에 관심있는 사람들을 위해


은, 지금은 UTF-8 변환에 UTF-16을 사용하고있는 모든 POCO 인터페이스를 (을 제외하고, 분명히, 변환 것들)는 UTF-8 문자열을 기대합니다. 필요한 경우 모든 전환을 내부적으로 처리합니다. – Alex