【问题标题】:Migrating C-->C++ Pointer to function throws compiler error将 C-->C++ 指针迁移到函数会引发编译器错误
【发布时间】:2017-09-04 17:50:28
【问题描述】:

TL:DR;在编译一个曾经是 C 为 C++ 的项目时,我收到此错误 error: initializing argument 2 of 'int SocketSrv(int, int (*)(), int*, int, int, int)'。该程序在没有警告的情况下编译为 C 代码(无论如何都在该行)。

代码是:

rtn=SocketSrv(RxServConfig->port_nbr1, fn, &RxDataSocketId,
            RxServConfig->max_children,
            RxServConfig->shmemkey,
            RxServConfig->semkey);

问题是我们将一个指向函数int function (int) 的指针指向一个需要int function() 的函数。

我什至不知道为什么这在 C 中有效,而且我无法访问被调用函数中的代码。

问题:我可以以某种方式将 int (*)(int) 转换为 int (*)() 吗?又是“为什么这行得通?”指向的函数实际上使用了参数,即使我们声明了一个没有参数的函数指针,C 是否也会传递参数?

【问题讨论】:

    标签: c++ c pointers


    【解决方案1】:

    在 c 中,int (*)() 表示指向返回 int 并接受未指定数量参数的函数的指针,在 c++ 中表示返回 int 并接受 0 的函数参数,所以这就是它在 c 中编译但在 c++ 中不编译的原因。

    要解决这个问题,需要更多信息,但您可以简单地为具有正确签名的函数编写重载,然后在其中调用另一个函数。

    【讨论】:

    • 有趣,绝对给了我更多研究的起点。它在一个调用分配给函数指针的几个不同函数的块中,我必须弄清楚它们是否都具有相同的签名,然后可能编写一个包装器。我想在 C++ 中不可能有未指定数量的参数?将其更改为 void 指针会改变事情吗?
    • @xyious 你可以尝试 reinterpret_cast(f) 如果你确定传递的指针类型正确并且问题出在被调用函数的声明中
    • @xyious 也许它可以适用于您拥有的两个想法中的任何一个,但请记住要小心并避免未定义的行为
    • 它与@Artemy Vysotsky 的解决方案一起编译。被调用的函数(它在静态链接的 C 库中)仍然可以调用参数指向的函数吗?
    • 函数必须使用完全相同数量和类型的参数调用。如果你来回转换函数指针,并且在调用它的最后,原型是被尊重的,C 标准向你保证它可以工作。如果没有,现实生活会保证你的代码会爆炸。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2013-05-19
    • 1970-01-01
    相关资源
    最近更新 更多