2017-11-14 9 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ドキュメントを確認してください、std::stringconst char*(どちらもUTF-8)からのみstd::wstring(つまり、最初のパスが失敗する理由)を期待するコンストラクタもありません。

どのようにしてconst wchar_t*でコンパイルされ、なぜ予期しない出力(間違ったパス)が表示されるのですか?

答えて

4

この質問のmvceを作成するとき、私は問題を理解しました。私はここにそれを文書化することを決めました。それが他の人にとって有益な場合に備えて。

質問に示すコードスニペットは、私は、コンパイル警告欠けていた巨大なプロジェクトの一部である:

警告C4800:「CONSTのwchar_t *」:値を強制的に「真」または「偽BOOLすると'(パフォーマンス警告)

それから私は、そこにコンストラクタPoco::Path::Path(bool absolute)であり、コンパイラが予期しない動作を生成、自動的にBOOLへのポインタからキャストを作っていたことを気づきました。出力の\は空の絶対パスに対応し、そのようなコンストラクタを使用するときの初期値に対応します。この問題を回避するに興味のある人のための


、私は今、UTF-8の変換にUTF-16を使用しています。今後の参考のために

#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

:すべてのPOCOインタフェース(当然、除く、変換のものを)UTF-8文字列が必要です。必要に応じて、内部的な変換が行われます。 – Alex

関連する問題