3.函数指针和typedf
我在搞高斯滤波时,发现一个静态回调函数:
C/C++ code
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
static void myGaussianBlur(int, void *); //这里声明没有形参很好理解
int main() { srcImage = imread("E:\\MIPMAP\\lena.jpg",1 ); namedWindow("Gaussian", 1); createTrackbar("Kernel: ", "Gaussian", &iGaussianBlur, 40, myGaussianBlur);//这里函数调用连括号都没带?? return 0; }
static void myGaussianBlur(int, void *)//函数定义没有形参?还能这么写? { GaussianBlur(srcImage, dstImage3, Size( GaussianBlur*2 + 1, iGaussianBlur*2 +1), 0, 0); imshow("Gaussian", dstImage3); } |
附createTrackbar原型:
C/C++ code
|
1 2 3 4 5 |
CV_EXPORTS int createTrackbar( const String& trackbarname, const String& winname, int* value, int count, TrackbarCallback onChange = 0, void* userdata = 0); |
附TrackbarCallback原型:
|
1 |
typedef void (*TrackbarCallback)(int pos, void* userdata);//不知道这是什么东东 |
typedef void (*TrackbarCallback)(int pos, void* userdata);/
定义TrackbarCallback为类型void (*)(int pos, void* userdata)的别名。
void (*)(int pos, void* userdata)是一个函数指针,该指针指向一类函数,该类函数带int和void *两个参数,无返回值。
大神,函数指针知道,但是指向一类函数的指针还是头一次听到,我查了 C++ primer (第五版),没有这部分内容,不知道这些知识是您自己推测的吗?还是有一些高级的书籍讲述了这部分内容?(话说我连 CV_EXPORTS 都一直不理解,就自己感觉是封装在lib的函数……)
第一个问题,这是一个函数指针,不是函数调用,不用也不能带括号
第二个问题,只有类型没有参数名的形参也叫哑元,一般是为了作兼容用,比如某个函数的形参已经不再需要了,
但是提供的对外的接口变量数不能改变,不然对其他模块的影响比较大,这时候就可以使用哑元
理解这个
typedef void (*TrackbarCallback)(int pos, void* userdata);/
typedef定义了一个别名函数
void (*TrackbarCallback)(int pos, void* userdata);
这个是一个函数指针,void表示返回类型,(*TrackbarCallback)函数指针,指向一个函数,(int pos, void* userdata)后面是两个参数

浙公网安备 33010602011771号