2017-11-14 2 views
5

Arbeiten mit Poco::Path Ich habe einen sehr seltsamen Fehler gefunden. Siehe folgenden Code:Poco :: Pfad kompiliert mit const wchar_t * aber verhält sich unerwartet

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

Aber die Ausgabe des obigen Programms ist (unter Windows):

\

statt der erwarteten:

c: \ temp

Überprüfung der Poco::Path Dokumentation Ich sehe keinen Konstruktor erwartet std::wstring (deshalb der erste Pfad fehlschlägt) noch const wchar_t*, nur von std::string und (beide UTF-8).

Wie kompiliert es mit const wchar_t* und warum die unerwartete Ausgabe (falscher Pfad)?

Antwort

4

Beim Erstellen der mvce für diese Frage habe ich das Problem herausgefunden. Ich habe beschlossen, es hier zu dokumentieren, falls es für jemand anderen hilfreich sein sollte.

Der Code-Schnipsel in der Frage gezeigt ist Teil eines großen Projekts, damit ich eine Compilation Warnung fehlt:

Warnung C4800: 'const wchar_t *': Wert zwingt Bool 'true' oder ‚false "(Warnung von Leistung)

dann erkannte ich, dass es einen Konstruktor ist Poco::Path::Path(bool absolute) und dass der Compiler die Besetzung von Zeiger machen wurde automatisch in bool, dann das unerwartete Verhalten zu erzeugen. Die \ der Ausgabe entspricht einem leeren absoluten Pfad, seinem Anfangswert bei Verwendung eines solchen Konstruktors.


diejenigen Für Interesse an einer Vermeidung des Problems verwende ich jetzt ein UTF-16 in UTF-8-Konvertierung:

#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

Für die Zukunft: alle Schnittstellen POCO (außer, natürlich, die Umwandlung diejenigen) erwarte UTF-8-Strings. Alle Konvertierungen werden bei Bedarf intern erledigt. – Alex

Verwandte Themen