C语言中的可选回调
在C中指定可选回调的惯用方法是什么?我有一个长时间运行的函数,它通过不断轮询Arduino硬件来等待一个无线数据包,我希望可以选择指定一个可选的回调,在每次轮询硬件并读取数据包失败后调用该回调。以下是骨架函数定义: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
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);
}