我在爲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