Как заставить функцию преобразования String в const wchar_t * работать под Windows и Linux - PullRequest
0 голосов
/ 07 декабря 2009

Я работаю над проектом, написанным для MSVCC / Windows, который мне нужно портировать на GCC / Linux. Проект имеет свой собственный класс String, который хранит свои данные в QString из Qt. Для преобразования в 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();
    }
}

Проблема в том, что объект больше не живет, когда возвращается эта функция, так что это не работает, eiter. Я думаю, что единственный способ решить эту проблему - либо:

  1. Не использовать String :: c_str () и вызывать .toStdString (). C_str () напрямую
  2. Заставить GCC обрабатывать wchar_t как 16-битный тип

Возможность, которая для меня означала бы несколько часов ненужной работы, и я не знаю, возможна ли вообще возможность 2. У меня вопрос, как мне решить эту проблему лучше всего? Буду признателен за любое полезное предложение. Спасибо.

1 Ответ

0 голосов
/ 07 декабря 2009

На мой взгляд, есть 2 способа:

  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.

...