Я использую библиотеку libxslt C, и мне нужно передать параметры как const char *
. Я оборачиваю библиотеку в класс Qt C ++, поэтому параметры, хранящиеся в классе C ++, сохраняются как QMap<QString, QString>
.
Моя первая попытка была просто:
const char *params[32];
int index = 0;
if (m_params.size() > 0) {
QMapIterator<QString, QString> it(m_params);
while (it.hasNext()) {
it.next();
params[index++] = it.key().toLocal8Bit().data();
params[index++] = it.value().toLocal8Bit().data();
}
}
params[index++] = nullptr;
qDebug() << params[0] << params[1]; // 0 0
Но я понимаю, что это не работает, потому что QByteArray
из toLocal8bit
выходит из области видимости почти сразу, как только я его использую.
Я пытался использовать strcpy, но у меня были те же проблемы с областью действия:
m_params.insert("some-key", "some-value", "another-key", "another-value");
if (m_params.size() > 0) {
QMapIterator<QString, QString> it(m_params);
while (it.hasNext()) {
it.next();
char buffer[32];
strcpy(buffer, it.key().toLocal8Bit().data());
params[index++] = buffer;
strcpy(buffer, it.value().toLocal8Bit().data());
params[index++] = buffer;
}
}
params[index++] = nullptr;
qDebug() << params[0] << params[1]; // another-value another-value
Так что теперь у меня есть список параметров с одинаковым значением.
Когда я устанавливаю все значения вручную, я получаю ожидаемые результаты:
const char *params[32];
int index = 0;
params[index++] = "something";
params[index++] = "something-else";
params[index++] = nullptr;
qDebug() << params[0] << params[1]; // something something-else