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

Posted

技术标签:

【中文标题】通过参数不匹配的函数指针调用函数【英文标题】:Calling a function through a function pointer where arguments are not matching 【发布时间】:2011-03-10 12:07:42 【问题描述】:

当我在研究一些 RPC 存根例程时,在 Unix 中由 RPCGEN -a msg.x 生成的 C 源文件。我遇到了一些让我感到困惑的函数指针。

在服务器存根文件 - msg_svc.c 中,有一个类似的声明

char *(*local)();

它声明了一个指向函数的指针,该函数不带参数并返回一个字符指针

在服务器文件-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;

struct svc_req *rqstp;

我的问题是为什么会这样?我已经对函数指针的 google/*** 进行了研究。在转换为不接受任何参数的函数指针后,并通过具有不匹配参数的函数指针调用函数(在这种情况下接受 2 个参数)应该会产生未定义的行为。

来源位于msg_svc.c

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

非常感谢。这清除了它。我想知道在处理函数指针变量可能存储具有不同参数的不同函数的情况时是否有更好的解决方案。

以上是关于通过参数不匹配的函数指针调用函数的主要内容,如果未能解决你的问题,请参考以下文章

重载函数的调用匹配规则

从被调用的函数调用函数时 VBA byref 参数类型不匹配

回调函数

4.6指针变量作参数

在c语言中怎么将数组直接作为函数的参数 比如 int f(int a[10]) 在调用函数时会显示

Javascript-回调函数浅谈