【发布时间】:2013-05-17 20:44:36
【问题描述】:
我正在使用一个实现命令外壳的 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 风格函数”,您需要
extern "C"语言链接,还是仅仅需要一个普通函数(不是函数对象或成员函数)? -
我不完全确定,但确实知道类静态函数可以在没有外部“C”包装器的情况下工作——这是否意味着语言链接无关紧要,只是函数是普通的功能?
-
联动在很多平台上无所谓,但不保证无所谓。你是对的,它必须是一个普通函数,因为成员函数有一个额外的隐藏参数来传递
this。在某些平台 (Windows) 上,this的传递方式甚至与其他参数不同。
标签: c++ c callback function-pointers