Я работаю над проектом, написанным для 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.
Я думаю, что единственный способ решить эту проблему - либо:
- Не использовать String :: c_str () и вызывать .toStdString (). C_str () напрямую
- Заставить GCC обрабатывать wchar_t как 16-битный тип
Возможность, которая для меня означала бы несколько часов ненужной работы, и я не знаю, возможна ли вообще возможность 2. У меня вопрос, как мне решить эту проблему лучше всего?
Буду признателен за любое полезное предложение. Спасибо.