2009-12-07 98 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

    相關問題