【发布时间】:2018-10-23 15:14:03
【问题描述】:
我正在使用 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
但我意识到这不起作用,因为来自toLocal8bit 的QByteArray 几乎在我使用它时就超出了范围。
我尝试过使用 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
【问题讨论】:
-
const char *params[(m_params.size() * 2) + 1];-- 除非m_params.size()是编译时常量,否则这不是有效的 C++ 代码。 -
@PaulMcKenzie 谢谢 - 有没有办法克服这个问题 - 否则我要么过度分配要么限制我可以设置的参数数量。
-
@codekaizer - 不确定你的副本如何帮助解决这个问题
-
@HorusKol --
std::vector<char *>(m_params.size() * 2 + 1) params;