2009-12-07 100 views
0

我在为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。 我认为解决这个问题的唯一办法是,要么:

  1. 不要使用字符串:: c_str()并调用.toStdString()c_str()直接
  2. 让GCC视wchar_t 16位类型

可能性意味着几个小时的不必要的工作给我,我不知道如果可能性2甚至是可能的。我的问题是,我如何最好地解决这个问题? 我会很感激任何有用的建议。谢谢。

回答

0

在我看来,有2种方式:需要

  • 让QString时,存储为wchar_t *和返回的QString时

    1. 转换QString时,wchar_t的* :: unicode的直接

    这两个函数可以将QString转换为std :: string和std :: wstring
    QString::toStdWString
    QString::toStdString

    要构建的QString作为UCS4:

    #define QT_QSTRING_UCS_4 
    #include "qstring.h" 
    

    这可以在QT3(qstring.h)一起使用。我无法找到qt4的来源。

  • +0

    需要时将QString转换为wchar_t *表示直接调用.toStdString()。c_str()。正如我之前所说,这将是很多工作和我最后的选择,尽管这将是解决这个问题的最佳方法。如果我理解你的意思,你的意思是我应该交替地让Qt返回一个32位的wchar,当通过添加这个#define来调用unicode()时。这个解决方案听起来不错。我会测试一下。 – weitho 2009-12-08 07:37:09

    +0

    当需要的时候意味着:我们应该非常小心地管理中间对象的生命周期(string,wstring)......否则,访问无效对象或内存泄漏。我们可以把wstring作为String类的成员吗?并且更新wstring当String :: c_str()被调用? – OwnWaterloo 2009-12-08 09:47:32

    +0

    谢谢。向String类中添加一个wstring成员,并在调用String :: c_str()时更新它,解决了我的问题。 :) – weitho 2009-12-08 12:58:00

    相关问题