Pointers 通过参数不匹配的函数指针调用函数

Pointers 通过参数不匹配的函数指针调用函数,pointers,function-pointers,rpc,Pointers,Function Pointers,Rpc,当我在研究一些RPC存根例程时,我使用了由Unix中的RPCGEN-a msg.x生成的C源文件。我遇到了一些使我困惑的函数指针 在服务器存根文件-msg_svc.c中,有如下声明 char *(*local)(); 它声明一个指向不带参数的函数的指针,并返回一个char指针 在服务器文件-msg_server.c中,有一个函数定义为 savemsg_1(argp, rqstp) char **argp; struct svc_req *rqstp; { some c

当我在研究一些RPC存根例程时,我使用了由Unix中的RPCGEN-a msg.x生成的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);
其中,参数和rqstp由

union {
    char *savemsg_1_arg;
    int readmsg_1_arg;
} argument;

我的问题是为什么这样做?我对函数指针上的google/stackoverflow进行了研究。在强制转换到不接受任何参数的函数指针,并通过该函数指针调用该函数(在本例中接受2个参数)后,应生成未定义的行为

该来源位于


我非常感谢您的任何意见。谢谢

这是未定义的行为。但是,未定义行为的一个可能结果是您想要的行为


特别是,生成的古老的C代码(用于
savemsg_1
)清楚地表明,这是非常古老、非常简单的编译器想要实现的。它们是相当可预测的,不使用寄存器进行参数传递,等等。这增加了代码工作的可能性。但“它可能有效”并不是一项成就。不要自己编写这种代码。

非常感谢。这就把事情弄清楚了。我想知道在处理函数指针变量可能存储具有不同参数的不同函数的情况时,是否有更好的解决方案。
struct svc_req *rqstp;