C中的可选回调

时间:2016-12-12 01:36:16

标签: c callback arduino

在C中指定可选回调的惯用方法是什么?我有一个长时间运行的功能,通过不断轮询Arduino硬件等待无线电数据包,我希望可以选择在每次轮询硬件并且无法读取数据包后指定可选的回调。这是骨架函数定义:

typedef void(*waitCallback)(const unsigned long elapsed);

bool readPacket(unsigned long timeout, waitCallback cb) {   
    long time = millis();
    unsigned long delta = 0;
    while(delta < timeout) {
        if(receivedPacket()) {
            return true;
        }
        delta = millis() - time;
        cb(delta);
    }
    return false;
}

我的问题是,如何使回调可选?如果我不想要任何回调,我可以在没有正文的情况下制作一个虚拟函数并将其指定为回调,但有更简洁的方法吗?

1 个答案:

答案 0 :(得分:1)

在这种情况下,您可以使用两种方法,不是那么干净既不优雅也适用于此。

方法一:传递NULL并在里面查看。

bool readPacket(unsigned long timeout, waitCallback cb) {   
    long time = millis();
    unsigned long delta = 0;
    while(delta < timeout) {
        if(receivedPacket()) {
            return true;
        }
        delta = millis() - time;
        if(cb!=null){
            cb(delta);
        }
    }
    return false;
}

方法二:定义没有参数的函数。它隐含地使用了方法。

bool readPacket(unsigned long timeout){
    return readPacket(timeout, NULL);
}

使用第二种方法,您可以制作一些与其他规范相匹配的通用函数。您可以传递其他类型的参数并隐含地投射它们,添加其他参数以进行预处理,检查错误......