2017-11-14 122 views
5

Poco::Path ile çalışma Çok ilginç bir hatayla karşılaştım. (Windows) 'dirPoco :: Yol const wchar_t * ile derler ama beklenmedik şekilde davranır

#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; 
} 

Fakat yukarıdaki programın çıktı:

c:

yerine beklendiği ait

\ aşağıdaki kodu Bkz: \ temp

Poco::Path belgelerini gözden geçirme std::wstring'u (bu yüzden ilk yol başarısız oluyor) veya const wchar_t*, yalnızca std::string ve const char* (her ikisi de UTF-8) bekliyor hiçbir kurucu göremiyorum.

const wchar_t* ile nasıl derleniyor ve neden beklenmedik çıktı (yanlış yol)?

cevap

4

Bu soru için mvce'u oluştururken sorunu çözdüm. Bir başkası için faydalı olması durumunda burada belgelemeye karar verdim.

söz gösterilen kod parçacığı yüzden bir derleme uyarı eksikti büyük bir projenin parçasıdır:

uyarı C4800: 'const wchar_t *' değeri zorlayarak 'gerçek' ya da 'yanlış bool '(performans uyarı)

sonra derleyici sonra beklenmeyen davranışlar üreten, otomatik bool için işaretçi döküm yapıyordu orada bir yapıcı Poco::Path::Path(bool absolute) ve fark etti. Çıktının \, boş bir mutlak yola, böyle bir kurucu kullanıldığında başlangıç ​​değerine karşılık gelir. İleride

#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

: Geçici bir çözüm ilgilenenler için


, şimdi UTF-8 dönüşüme bir UTF-16 kullanıyorum tüm POCO arabirimleri (hariç, belli ki, dönüşüm olanları UTF-8 dizeleri bekliyoruz. Gerekirse, herhangi bir dönüşüm dahili olarak halledilir. – Alex