最近看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函数啊?
求高手解释。
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
5
感觉函数指针指向的函数参数少了。
10
你那个定义不是很严谨而已
https://linux.die.net/man/3/libnids,这里写的是
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
与参数无关。参数在后面有限制,除非你使用不定参数类型。
5
不是的,函数会调指针的类型是
type (*)(parament) 以类型和表达式规则来看 首先(*)表明是一个指针,其次 type表示这个指针的类型是type 后面的(parament)表明这个东西有参数是函数指针。
所以这是执行参数为(parament) 返回值是type的函数地址的一个指针
type (*)(parament) 以类型和表达式规则来看 首先(*)表明是一个指针,其次 type表示这个指针的类型是type 后面的(parament)表明这个东西有参数是函数指针。
所以这是执行参数为(parament) 返回值是type的函数地址的一个指针
5
始终与参数无关。前者传的是函数指针,后者传的是指针。
5
所谓指针,你可以简单理解为地址。当然,一般情况下,指针一层含义,就是size,用于实现增,或减。
唯独void指针,是没有size的,所以,你可以将它强制转为任何size的指针,或把任何size的指针转为它。这样做当然是有风险的,size信息在转换中丢失,若你前后的size不一致,则可能会导致非法内存访问。
仅看它“地址”这一层含义。函数指针,也是指针,只不过程序不是按这个地址去取值,而是跳到这个地址去执行代码。所以,你传入void(*)若是一个函数指针,应该算是没有参数的,原因是这里没有任何函数参数传递时的入栈出栈(当然你也可以手动完成,还是有很大风险)。
总的来说,void(*)只代表了本身可以是任意类型,若是函数指针,它管不到参数头上去。
唯独void指针,是没有size的,所以,你可以将它强制转为任何size的指针,或把任何size的指针转为它。这样做当然是有风险的,size信息在转换中丢失,若你前后的size不一致,则可能会导致非法内存访问。
仅看它“地址”这一层含义。函数指针,也是指针,只不过程序不是按这个地址去取值,而是跳到这个地址去执行代码。所以,你传入void(*)若是一个函数指针,应该算是没有参数的,原因是这里没有任何函数参数传递时的入栈出栈(当然你也可以手动完成,还是有很大风险)。
总的来说,void(*)只代表了本身可以是任意类型,若是函数指针,它管不到参数头上去。