当我在Unix中学习RPCGEN -a msg.x生成的一些RPC存根例程C源文件时。我遇到了一些困扰我的函数指针。
在服务器存根文件--msg_svc.c中,有一个类似
的声明char *(*local)();
声明一个指向函数的指针,该函数不带参数并返回一个char指针
在服务器文件--msg_server.c中,有一个定义为
的函数savemsg_1(argp, rqstp)
char **argp;
struct svc_req *rqstp;
{
some code
}
回到服务器存根文件--msg_svc.c,我看到执行函数指针转换的代码
local = (char *(*)()) savemsg_1;
稍后通过
打电话result = (*local)(&argument, rqstp);
其中argument和rqstp由
定义union {
char *savemsg_1_arg;
int readmsg_1_arg;
} argument;
和
struct svc_req *rqstp;
我的问题是为什么这有效?我已经在函数指针上研究了google / stackoverflow。在转换为不接受任何参数的函数指针之后,并通过具有不匹配参数的函数指针调用该函数(在这种情况下接受2个参数)应该生成未定义的行为。
来源位于msg_svc.c
我真的很感激任何投入。感谢
答案 0 :(得分:1)
这是未定义的行为。但是,未定义行为的一个可能结果是您想要的行为。
特别是,生成的古代C代码(对于savemsg_1
)清楚地表明这是由非常古老,非常简单的编译器编写的。它们是相当可预测的,不使用寄存器来传递参数,等等。这增加了代码工作的可能性。但“它可能有效”真的不是一个成就。不要自己写这种代码。