[英]What does “void SomeFunction(int, void*)” mean?
我正在尝试一些OpenCV,并且正在使用Canny边缘检测器Example的教程。
在本教程中,有一个这样声明的函数:
void CannyThreshold(int, void*)
然后从main内部这样调用;
CannyThreshold(0, 0);
我不理解声明的(int,void *)部分的目的,因为CannyThreshold函数中没有使用任何这些参数。
为什么不只是这样声明呢?
void CannyThreshold();
注意示例中的这一行:
createTrackbar( "Min Threshold:", window_name, &lowThreshold, max_lowThreshold, CannyThreshold );
在这里, CannyThreshold
作为回调参数传递给createTrackbar
。 createTrackbar
的签名要求回调函数接受这两个参数,即使CannyThreshold
没有用到它们也是如此。
如果将函数声明为
void CannyThreshold();
那和
void CannyThreshold(void);
换句话说,它是一个不带参数的函数。
如果要让函数接受参数,但不要使用这些参数,则仍必须声明参数的类型。
据推测这是因为此函数是一个回调 ,因此其签名是通过使用的任何API(此处为OpenCV)来强制执行的。
回调是在事件发生时将该函数注册到事件系统中以供稍后调用时给该函数赋予的名称。 注册回调的函数称为函子 ,它将另一个函数作为参数,并对其进行处理。 范例:
using callback_t = void(*)(int);
void register_callback(callback_t cb);
如果要定义一个要由register_callback
调用(返回)的回调,则即使不需要整数,它也必须是一个带有int
并返回void
的函数。 因此,以下定义是可能的:
void my_callback(int) { std::cout << "done\n"; }
register_callback(my_callback);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.