【问题标题】: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/stackoverflow 进行了研究。在转换为不接受任何参数的函数指针后,并通过具有不匹配参数的函数指针调用函数(在这种情况下接受 2 个参数)应该会产生未定义的行为。

来源位于msg_svc.c

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

【问题讨论】:

    标签: pointers function-pointers rpc


    【解决方案1】:

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

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

    【讨论】:

    • 非常感谢。这清除了它。我想知道在处理函数指针变量可能存储具有不同参数的不同函数的情况时是否有更好的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    相关资源
    最近更新 更多