我想将QString
变量传递给带const wchar_t*
参数的函数。
安全解决方案是:
void foo(const wchar_t*);
QString x = "test";
foo(x.toStdWString().c_str());
但它有转换为wstring
的开销。有没有更快的解决方案?
这个解决方案怎么样?它安全便携吗?
foo(reinterpret_cast<const wchar_t*>(x.constData()));
答案 0 :(得分:6)
不,重新解释强制转换是不安全的,并且在编码不同的某些平台上不起作用。 QChar
是16位,内部编码是UTF-16,但在Linux wchar_t
上是32位UCS-4编码。
在wchar_t
永远停留在16位的Windows上,演员阵容会发生工作(它仍然是未定义的行为,但msc ++目前不会做任何会破坏它的事情),但是使用Qt是可移植的,对吧?
请注意,通过std::wstring
进行转换的效率与您获得的效率相同。鉴于编码内存的差异必须分配一次,由std::wstring
管理(即使在C ++ 98中也可以省略返回副本),std::wstring::c_str()
是一个微不足道的getter。
答案 1 :(得分:-1)
如果x.constData
为您提供可查询为const wchar_t*
的数据,则您不会需要演员。
任何在没有强制转换的情况下都不会编译的情况会严重破坏(非法别名,很可能也是不兼容的编码)。
看起来正确的方式是x.utf16()
(没有演员表),即使那时wchar_t
只有unsigned short
。见http://qt-project.org/doc/qt-4.8/qstring.html#utf16
QString
始终为UTF-16,因此如果wchar_t
不是,则没有转换的方法。