回调函数使用中void (*)表示什么啊

C语言 在路上 537次浏览
最近看Libnids,看到其中有一个函数:
void nids_register_tcp(void (*));
给出的解释是参数应该是一个回调函数,而且回调函数的定义类型如下
void tcp_callback(struct tcp_stream * ns, void ** param);
void nids_register_tcp(void (*))中参数void (*)表示什么?
不应该是void (*) () (struct tcp_stream *ns ,void ** param);吗? 这样的一个函数指针才能接收tcp_callback函数啊?
求高手解释。
解决方案

10

这个(void(*))表示这个参数是个函数指针,也就是把你的回调函数传进入。

5

感觉函数指针指向的函数参数少了。

10

你那个定义不是很严谨而已
https://linux.die.net/man/3/libnids,这里写的是

void nids_register_tcp(void (*tcp_func)(struct tcp_stream *ts, void **param));

这样写

void nids_register_tcp(void (*));

会接受任何指针类型(void *),哪怕并不是一个函数,编译器也不会报错

5

与参数无关。参数在后面有限制,除非你使用不定参数类型。

引用:

也就是说void(*)可以接受全部类型的函数了?不管他的返回值和参数个数以及参数类型?

5

不是的,函数会调指针的类型是
type (*)(parament) 以类型和表达式规则来看   首先(*)表明是一个指针,其次 type表示这个指针的类型是type 后面的(parament)表明这个东西有参数是函数指针。
所以这是执行参数为(parament) 返回值是type的函数地址的一个指针

5

始终与参数无关。前者传的是函数指针,后者传的是指针。

引用:
Quote: 引用:

你那个定义不是很严谨而已
https://linux.die.net/man/3/libnids,这里写的是

void nids_register_tcp(void (*tcp_func)(struct tcp_stream *ts, void **param));

这样写

void nids_register_tcp(void (*));

会接受任何指针类型(void *),哪怕并不是一个函数,编译器也不会报错

也就是说void(*)可以接收任何类型的函数了? 而不管函数的返回值类型、参数个数和参数类型?

5

所谓指针,你可以简单理解为地址。当然,一般情况下,指针一层含义,就是size,用于实现增,或减。
唯独void指针,是没有size的,所以,你可以将它强制转为任何size的指针,或把任何size的指针转为它。这样做当然是有风险的,size信息在转换中丢失,若你前后的size不一致,则可能会导致非法内存访问。
仅看它“地址”这一层含义。函数指针,也是指针,只不过程序不是按这个地址去取值,而是跳到这个地址去执行代码。所以,你传入void(*)若是一个函数指针,应该算是没有参数的,原因是这里没有任何函数参数传递时的入栈出栈(当然你也可以手动完成,还是有很大风险)。
总的来说,void(*)只代表了本身可以是任意类型,若是函数指针,它管不到参数头上去。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明回调函数使用中void (*)表示什么啊
喜欢 (0)or分享 (0)