我在为MSVCC/Windows编写的项目上工作,我必须移植到GCC/Linux。该项目有它自己的字符串类,它将数据存储在Qt的QString中。另外,为了转换为wchar_t *这里原是该方法(适用于Windows):如何使字符串const const wchar_t *转换函数在Windows和Linux下工作
const wchar_t* String::c_str() const
{
if (length() > 0)
{
return (const wchar_t*)QString::unicode();
}
else
{
return &s_nullString;
}
}
由于unicode的()返回一个QChar则(这是16位长),这个工作在Windows下为wchar_t的是16位在那里,但现在与GCC wchar_t是32位长,所以不再工作。我试图解决,使用此:
const wchar_t* String::c_str() const
{
if (isEmpty())
{
return &s_nullString;
}
else
{
return toStdWString().c_str();
}
}
这样做的问题是,该对象已不居住在这个函数返回,所以这是行不通eiter。 我认为解决这个问题的唯一办法是,要么:
- 不要使用字符串:: c_str()并调用.toStdString()c_str()直接
- 让GCC视wchar_t 16位类型
可能性意味着几个小时的不必要的工作给我,我不知道如果可能性2甚至是可能的。我的问题是,我如何最好地解决这个问题? 我会很感激任何有用的建议。谢谢。
需要时将QString转换为wchar_t *表示直接调用.toStdString()。c_str()。正如我之前所说,这将是很多工作和我最后的选择,尽管这将是解决这个问题的最佳方法。如果我理解你的意思,你的意思是我应该交替地让Qt返回一个32位的wchar,当通过添加这个#define来调用unicode()时。这个解决方案听起来不错。我会测试一下。 – weitho 2009-12-08 07:37:09
当需要的时候意味着:我们应该非常小心地管理中间对象的生命周期(string,wstring)......否则,访问无效对象或内存泄漏。我们可以把wstring作为String类的成员吗?并且更新wstring当String :: c_str()被调用? – OwnWaterloo 2009-12-08 09:47:32
谢谢。向String类中添加一个wstring成员,并在调用String :: c_str()时更新它,解决了我的问题。 :) – weitho 2009-12-08 12:58:00