Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中的可选回调_C_Callback_Arduino - Fatal编程技术网

C语言中的可选回调

C语言中的可选回调,c,callback,arduino,C,Callback,Arduino,在C中指定可选回调的惯用方法是什么?我有一个长时间运行的函数,它通过不断轮询Arduino硬件来等待一个无线数据包,我希望可以选择指定一个可选的回调,在每次轮询硬件并读取数据包失败后调用该回调。以下是骨架函数定义: typedef void(*waitCallback)(const unsigned long elapsed); bool readPacket(unsigned long timeout, waitCallback cb) { long time = millis

在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;
}
typedef void(*waitCallback)(const unsigned long-appeased);
bool readPacket(无符号长超时,waitCallback cb){
长时间=毫秒();
无符号长增量=0;
while(增量<超时){
if(receivedPacket()){
返回true;
}
delta=毫秒()-时间;
cb(delta);
}
返回false;
}

我的问题是,如何使回调成为可选的?如果我不需要任何回调,我可以创建一个没有主体的伪函数,并将其指定为回调,但有没有更干净的方法来实现这一点?

在本例中,您可以使用两种方法,既不干净也不优雅,但适用于此

方法一:传递
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;
}

使用第二种方法,您可以生成一些与其他规范匹配的通用函数。您可以传递其他类型的参数并隐式强制转换它们,添加其他参数以进行预处理,检查错误…

只需为回调传递NULL,然后在函数内部测试
cb!=调用它之前,请先将
cb
作为
NULL
传递,如果不需要回拨,请在
readPacket
内检查
cb
是否为
NULL
如果不是
NULL
则进行回拨。
bool readPacket(unsigned long timeout){
    return readPacket(timeout, NULL);
}