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

时间:2011-03-10 12:07:43

标签: pointers function-pointers rpc

当我在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

我真的很感激任何投入。感谢

1 个答案:

答案 0 :(得分:1)

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

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