在学习KAME的IPv6实现过程中,在ICMP6的处理中遇到了相应问题,google了一下,找到了相应的答案。
首先定义了一个函数指针 void (*ctlfunc) (int, struct nps_sockaddr*, void*);
然后将协议转换表中的响应控制输入函数转换为定义的指针的类型
以udp6_ctlinput为例,函数原型为 void udp6_ctlinput(int, struct nps_sockaddr*, void*)
通过下面的赋值
ctlfunc = (void (*) (int, struct nps_sockaddr*, void*)) (udp6_ctlinput);
然后使用指针ctlfunc 调用相关的上层协议处理函数。
附 http://topic.csdn.net/u/20070904/18/90d27a6d-9a2d-41a1-9246-bf5b5662cd62.html
我现在手头有这么一个C文件: (MTK手机平台)
typedef void (*PsExtPeerFuncPtr) (void *, int, void *);
typedef void (*PsFuncPtr) (void *);
PsExtPeerFuncPtr Func1;
PsFuncPtr Func2;
如下转换是否存在问题:
Func1 = (PsExtPeerFuncPtr *)Func2;
(*Func1 ) (a,b, c);
这里略写Func2的实体
Func1函数有3个参数,Func2只有一个参数,那么a、b、c三个参数如何传到Func2中?

在KAME的IPv6实现中,遇到ICMP6处理的问题,通过将不同原型的函数指针进行类型转换解决。例如,将`udp6_ctlinput`函数指针转换为通用的`ctlfunc`类型。在MTK手机平台的C文件中,存在`PsExtPeerFuncPtr`和`PsFuncPtr`两种函数指针类型,将`PsFuncPtr`类型的`Func2`转换为`PsExtPeerFuncPtr`类型并调用,尽管`Func2`只接受一个参数,但在转换后传入多个参数的行为会导致未定义行为。
2113

被折叠的 条评论
为什么被折叠?



