将0附加到不完整的宏参数列表

时间:2016-04-29 10:39:31

标签: c macros c-preprocessor

我使用了以下几个 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

欢迎提供帮助。

2 个答案:

答案 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,)