我正在尝试一些OpenCV并且正在使用Canny边缘检测器Example的教程。
在本教程中,有一个声明如下的函数:
void CannyThreshold(int, void*)
然后从main里面调用这个;
CannyThreshold(0, 0);
我不明白声明(int,void *)部分的目的,因为CannyThreshold功能中没有使用这些参数。
为什么它不仅仅是这样声明?
void CannyThreshold();
答案 0 :(得分:8)
请注意示例中的这一行:
createTrackbar( "Min Threshold:", window_name, &lowThreshold, max_lowThreshold, CannyThreshold );
此处,CannyThreshold
作为回调参数传递给createTrackbar
。 createTrackbar
的签名要求回调接受这两个参数,所以CannyThreshold
会这样做,即使它没有用它们。
答案 1 :(得分:1)
如果您将该功能声明为
void CannyThreshold();
与
相同void CannyThreshold(void);
换句话说,它是一个不需要参数的函数。
如果你希望函数接受参数,但从不使用这些参数,你仍然必须声明参数的类型。
答案 2 :(得分:1)
这应该是因为这个函数是一个回调,因此它的签名是由任何使用的API强制执行的(这里是:OpenCV)。
回调是当函数注册进入事件系统时,函数给出的名称,以便稍后调用。注册回调的函数称为仿函数,它将另一个函数作为参数,并对其执行某些操作。例:
using callback_t = void(*)(int);
void register_callback(callback_t cb);
如果你想要register_callback
定义一个要回调的回调,那么它需要是一个int
并返回void
的函数,即使你没有&#39 ; t需要整数。因此,以下定义是可能的:
void my_callback(int) { std::cout << "done\n"; }
register_callback(my_callback);