我使用了以下几个 C 预处理器宏:
#define TAKE4(a1, a2, a3, a4, ...) a1, a2, a3, a4
#define FILL_PARAMS(...) TAKE4(__VA_ARGS__, 0, 0, 0, 0)
当使用1,2或3个参数调用FILL_PARAMS
时,后面的(未指定的)会按预期变为0,但是当没有给出参数时会出现错误。
有没有办法添加对无参数的支持?
澄清:
目前支持以下用途:
FILL_PARAMS(1) // => 1, 0, 0, 0
FILL_PARAMS(1, 2) // => 1, 2, 0, 0
FILL_PARAMS(1, 2, 3) // => 1, 2, 3, 0
我想添加对以下边缘情况的支持:
FILL_PARAMS() // => 0, 0, 0, 0
欢迎提供帮助。
答案 0 :(得分:2)
找到了一个黑客解决方案:
QNetworkAccessManager* manager = new QNetworkAccessManager;
connect(manager, SIGNAL(finished(QNetworkReply*)), SLOT(fReply(QNetworkReply*)));
QString url = QString("http://maps.google.com/maps/api/geocode/json?address=%1&sensor=false&language=en").arg(your_address);
manager->get(QNetworkRequest(QUrl(url)));
void fReply(QNetworkReply *reply)
{
QString json = reply->readAll();
QString strUrl = reply->url().toString();
QJson::Parser parser;
bool ok;
// json is a QString containing the data to convert
//QVariant result = parser.parse (json.toLatin1(), &ok);
QVariant result = parser.parse (json.toLatin1(), &ok);
if(!ok)
{
qDebug()<< (QString("HATA : Cannot convert to QJson object: %1").arg(json));
return;
}
QString code = result.toMap()["status"].toString();
qDebug() << "Code" << code;
if(code != "OK")
{
qDebug() << (QString("HATA : Code of request is: %1").arg(code));
return;
}
QVariantList results = result.toMap()["results"].toList();
if(results.count() == 0)
{
qDebug() << (QString("HATA : Cannot find any locations"));
return;
}
double east = results[0].toMap()["geometry"].toMap()["location"].toMap()["lng"].toDouble();
double north = results[0].toMap()["geometry"].toMap()["location"].toMap()["lat"].toDouble();
}
至少适用于以下测试用例。
#define TAKE4(a1, a2, a3, a4, ...) a1, a2, a3, a4
#define FILL_PARAMS(...) TAKE4( __VA_ARGS__ + 0, 0, 0, 0, 0)
答案 1 :(得分:0)
您可以通过多种方式实现这一目标,最简单的方法是使用
dispatch_async(dispatch_get_main_queue(), ^{
[self getAllData];
});
作为空案例。
使用另一种更复杂,更麻烦的方法是在最后一个参数后面总是有逗号:
FILL_PARAMS(0)
或者通过GCC逗号延伸扩展来创造一点点创意:
#define TAKE4(a1, a2, a3, a4, ...) a1, a2, a3, a4
#define FILL_PARAMS(...) TAKE4(__VA_ARGS__ 0, 0, 0, 0)
/* called like: */
FILL_PARAMS()
FILL_PARAMS(1,)
FILL_PARAMS(1,2,)
FILL_PARAMS(1,2,3,)