使用Poco::Path
我发现了一个非常奇怪的错误。请参阅以下代码:
#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;
}
但上述程序的输出是(在Windows中):
\
而不是预期的:
C:\ TEMP
审核Poco::Path
文档时,我看到没有构造函数期望std::wstring
(这就是第一条路径失败的原因),const wchar_t*
,只有std::string
和const char*
(都是UTF-8)。
如何使用const wchar_t*
进行编译以及为什么出现意外输出(错误的路径)?
答案 0 :(得分:3)
为此问题创建mvce时,我发现了问题所在。我决定在这里记录它,以防它对其他人有帮助。
问题中显示的代码段是一个巨大项目的一部分,所以我错过了编译警告:
警告C4800:'const wchar_t *':强制值为bool'true'或'false'(性能警告)
然后我意识到有一个构造函数Poco::Path::Path(bool absolute)
,并且编译器自动将指针转换为bool,然后产生意外行为。输出的\
对应于空的绝对路径,它是使用这种构造函数时的初始值。
对于那些对解决方案感兴趣的人,我现在使用的是UTF-16到UTF-8的转换:
#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));