3.函数指针和typedf

我在搞高斯滤波时,发现一个静态回调函数:

C/C++ code

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

static void myGaussianBlur(intvoid *); //这里声明没有形参很好理解

 

int main()

{   

srcImage = imread("E:\\MIPMAP\\lena.jpg",1 );

namedWindow("Gaussian", 1);   

createTrackbar("Kernel: ", "Gaussian", &iGaussianBlur, 40, myGaussianBlur);//这里函数调用连括号都没带??

return 0;

 

static void myGaussianBlur(intvoid *)//函数定义没有形参?还能这么写?

{   

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)后面是两个参数

posted @ 2020-06-27 19:01  janeyjhon1  阅读(69)  评论(0)    收藏  举报