c++ - 使用带有 C 函数指针的 C++ 类成员函数

标签 c++ c callback function-pointers

我正在使用一个实现命令 shell 的 C 库。自定义 shell 命令通过实现具有以下调用签名的函数来注册:

typedef void(* shellcmd_t)(BaseSequentialStream *chp, int argc, char *argv[])

然后在静态结构中注册该函数,该结构将字符串命令名称映射到该函数指针,如下所示:

static const ShellCommand commands[] = {
  {"myfunction", myfunction},
  {NULL, NULL}
}

myfunction 的样子:

void myfunction(BaseSequentialStream *chp, int argc, char *argv[])
{
   // do some stuff
}

我正在使用 C++ 并希望将一些 shell 命令实现为类实例成员函数(而不是静态成员函数)。有没有办法使用 <functional> 中的任何东西?这样我就可以从类实例成员函数中获取兼容的函数指针并将其注册到 ShellCommand 结构数组中?我一直在阅读关于 std::bind 和 std::function 的文章,我觉得你可以给他们一个指向 C 风格函数的指针,但是你不能从他们所以它似乎不会起作用,但也许我只是遗漏了一些东西。

如果有人有解决这个问题的好方法,我很想听听。看起来我可能必须将它实现为一个平面 C 函数,然后可以调用一些东西,为它提供指向我想要的实例的指针/引用,然后一旦我拥有它,我就可以将调用转发给该实例成员函数。它看起来有点困惑,希望有更好的方法。

最佳答案

不,这不能直接按照您希望的方式进行。在 C 接口(interface)中,您无法以某种方式传递类的隐式实例,C 接口(interface)根本没有用于此的插槽。因此,您必须显式地将指针传递给实例并调用类函数。这会给您带来的好处是对其他类方法的保护。

所有这些都与 extern "C" 链接的名称修饰方面无关,但最终与 ABI 无关。一旦从编译单元中的变量(此处为数组元素)中导出指向函数的指针,“原始”符号是否被破坏都无关紧要。类型系统保证函数将始终以正确的调用约定被调用。

关于c++ - 使用带有 C 函数指针的 C++ 类成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16617599/

相关文章:

c++ - 函数返回值如何工作

java - OpenCV Android 人像模式全屏设置

c - 获取准确的用户输入,c

链接到 Ox 的 C 库

c++ - 从函数 c++ 返回后的错误值

c++ - Emacs CEDET 语义完成 "cannot find types for ..."

使用数组创建堆栈

callback - Pinterest按钮有回调吗?

java - 如何使用 Android 后退按钮在我的应用程序中返回而不是关闭我的应用程序?

ios - 处理通知回调 - IOS