【问题标题】:How to make String to const wchar_t* conversion function work under Windows and Linux如何使 String 到 const wchar_t* 转换函数在 Windows 和 Linux 下工作
【发布时间】:2010-12-24 01:45:10
【问题描述】:

我从事一个为 MSVCC / Windows 编写的项目,我必须移植到 GCC / Linux。该项目有自己的字符串类,它将其数据存储在来自 Qt 的 QString 中。对于转换为 wchar_t*,最初有这种方法(适用于 Windows):

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();
    }
}

这样做的问题是,当这个函数返回时,对象不再存在,所以这也不起作用。 我认为解决此问题的唯一方法是:

  1. 不要使用 String::c_str() 直接调用 .toStdString().c_str()
  2. 让 GCC 将 wchar_t 视为 16 位类型

可能性一对我来说意味着几个小时的不必要的工作,我不知道可能性二是否可能。我的问题是,如何最好地解决这个问题? 我会很感激任何有用的建议。谢谢。

【问题讨论】:

    标签: gcc wchar-t c-str


    【解决方案1】:

    在我看来,有两种方法:

    1. 在需要时将 QString 转换为 wchar_t*
    2. 让QString存储wchar_t*,直接返回QString::unicode

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

    将 QString 构建为 ucs4 :

    #define QT_QSTRING_UCS_4
    #include "qstring.h"
    

    这可以在 qt3(qstring.h) 中使用。找不到qt4的源码。

    【讨论】:

    • 在需要时将 QString 转换为 wchar_t* 意味着直接调用 .toStdString().c_str() 。正如我之前所说,这将是很多工作,也是我的最后一个选择,尽管这将是解决这个问题的最佳方法。如果我理解正确,您的意思是我应该在通过添加此#define 调用 unicode() 时让 Qt 返回一个 32 位 wchar。这个解决方案对我来说听起来不错。我会测试一下。
    • 当需要时意味着:我们应该非常小心地管理the lifetime of intermediate object(string,wstring) ...否则,访问无效对象或内存泄漏。我们可以把wstring作为String类的成员吗?调用 String::c_str() 时更新 wstring ?
    • 谢谢。将 wstring 成员添加到 String 类并在调用 String::c_str() 时对其进行更新解决了我的问题。 :)
    猜你喜欢
    • 2013-03-19
    • 2014-04-27
    • 2010-09-19
    • 1970-01-01
    • 2012-08-04
    • 2012-11-15
    • 2020-07-25
    相关资源
    最近更新 更多